1. Introduction
Simms Creek is a small, 3rd order stream that drains an area of
~1,800 ha into the Salish Sea, near Campbell River’s Willow Point
neighborhood. The lower reach of Simms Creek (~3 km of channel, east of
Dogwood Street), is contained within a narrow urban green way that is
bordered by residential properties. From Dogwood Street Road the streams
runs for ~ 2 km to the Inland Highway and is protected within Beaver
Lodge Lands , upstream of the Inland Highway, >1.5 km of tributary
channel is located within private forest lands in various stages of
regeneration.
Chum, Chinook, Pink and Coho salmon have all been observed in Simms
Creek, as well as Coastal Cutthroat Trout (CCT), Rainbow Trout and
steelhead. More recent monitoring (i.e., this dataset), suggest that
Coho Salmon (CO) and CCT are the primary species within Simms Creek,
both of which are present within the stream year round - though a small
number of juvenile Chinook Salmon were identified in 2024.
Greenways Land Trust has
supported Simms Creek Stewards for +20 years, including operation of a
fish fence near the mouth of the stream since 2008. Juvenile and adult
fish moving past the fence are tallied each spring and fall,
respectively. The objective of this project is to explore the juvenile
fence dataset. All work is being done strictly for fun and out of
personal curiosity. Any feedback, input, or support is welcome. Also, I
have a soft spot for CCT, so be warned that effort and results will be
slightly trout biased. Let’s take a look at what has been completed to
date. It’s a tremendous amount of work and all volunteers and supporters
should be commended!
Download Fence Data (.csv)
Download Enviromental Data (.csv)
2. Fence Operation
2.1. Monitoring Effort
The Simms Creek fish fence has operated annually since 2008, with the
exception of 2020 and 2021 when operations were paused due to the
COVID-19 Pandemic and in the spring of 2023 when federal employees were
on strike.
Spring surveys target out migrating juvenile Coho Salmon but also
capture an impressive number of CCT and have even captured some Chinook
Salmon. Spring fence monitoring has started as early as April 03,
however, most surveys (50%) don’t start until April 18. In each
monitoring year, the fence has operated continuously (e.g., sampling
occurred at least daily) from April 28 to May 30. Surveys have continued
as late as June 13, but most (50%) are terminated by June 06.
Fall surveys to count the number returning adult Coho, Chinook, Chum
and Pink Salmon and also intercept a small number of CCT. In the fall,
surveys have started as early as September 26, however, most surveys
(50%) have started on October 08. In each monitoring year, surveys have
occurred continuously (e.g., sampling occurred daily) from October 23 to
November 16. Surveys have continued as late as December 10 and no
surveys have occurred later than December 02.
Monitoring Effort Tables and Figures
Table 1. Sampling Summary
Table 2. Annual Spring and Fall Trap Operation Periods
Table 2. Annual spring and fall trap operation periods.
Spring Sampling
Fall Sampling
Year
# Days Sampled
Start
End
# Days Sampled
Start
End
2008
41
Apr-21
May-31
40
Oct-14
Nov-22
2009
50
Apr-19
Jun-07
40
Oct-14
Nov-22
2010
42
Apr-19
May-30
35
Oct-23
Nov-26
2011
49
Apr-19
Jun-06
46
Oct-18
Dec-02
2012
50
Apr-16
Jun-04
50
Oct-14
Dec-02
2013
49
Apr-14
Jun-01
62
Sep-29
Dec-01
2014
45
Apr-24
Jun-07
58
Oct-04
Nov-30
2015
52
Apr-10
May-31
62
Oct-08
Dec-08
2016
63
Apr-03
Jun-04
60
Oct-07
Dec-05
2017
68
Apr-05
Jun-11
56
Oct-11
Dec-05
2018
52
Apr-21
Jun-11
58
Oct-08
Dec-04
2019
51
Apr-18
Jun-07
64
Oct-08
Dec-10
2020
0
COVID
-
0
-
-
2021
0
COVID
-
0
-
-
2022
47
Apr-28
Jun-13
37
Oct-11
Nov-16
2023
0
DFO Strike
-
45
Sep-26
Nov-17
2024
55
Apr-12
Jun-05
0
-
-
2.2 Stream Conditions
During each daily trap visit, volunteers record measures of water
temperature, pH, Total Suspended Sediment (TSS), dissolved oxygen, and
water level (stage). Mean annual measures of each parameter are
presented below for the spring and fall monitoring periods (Table 3 and
Table 4, Figure 2).
Stream Conditions Figures and Tables
Table 3. Spring Condition Table
Table 3. Stream conditions during spring trap operation.
Year
Spring Monitoring
Air Temp. (°C)
Water Temp. (°C)
pH .
DO (mg/L)
TDS (ppm)
Water Level (m)
Mean
SD
Mean
SD
Mean
SD
Mean
SD
Mean
SD
Mean
SD
2008
9.5
4.0
10.5
2.8
7.1
0.3
10.8
0.8
67.8
36.8
0.2
0.0
2009
11.8
3.0
10.3
2.4
7.1
0.2
10.3
0.8
136.4
26.2
0.3
0.0
2010
9.5
2.2
10.0
1.6
8.2
0.3
10.5
1.8
110.2
17.4
0.2
0.1
2011
9.8
2.3
9.8
2.1
6.7
0.3
9.1
1.0
95.5
11.7
0.2
0.0
2012
11.0
2.1
10.2
1.7
7.4
0.8
9.9
1.4
99.4
17.2
0.2
0.1
2013
10.3
2.9
10.1
2.0
7.9
0.3
11.5
0.9
100.6
14.9
0.2
0.1
2014
12.2
2.4
11.3
1.7
8.1
0.5
9.7
0.6
97.8
19.2
0.2
0.1
2015
10.5
3.4
11.0
2.5
8.1
0.2
9.4
0.8
106.7
22.2
0.2
0.4
2016
11.4
2.8
11.7
1.8
7.1
0.4
10.2
1.5
111.3
20.1
0.1
0.0
2017
9.6
3.0
10.2
2.3
8.2
0.4
10.9
2.2
77.8
25.6
0.3
0.1
2018
10.7
2.5
8.7
1.3
8.8
1.4
14.2
1.6
153.9
21.2
0.1
0.0
2019
11.2
2.7
11.9
2.3
8.0
0.2
8.6
0.7
129.0
25.7
0.1
0.1
2022
11.7
2.5
12.2
16.0
7.5
0.3
-
-
83.0
17.2
0.2
0.1
2023
-
-
-
-
-
-
-
-
-
-
-
-
2024
12.1
2.2
10.3
2.1
7.7
0.4
10.2
0.9
129.8
30.0
0.1
0.0
Table 4. Fall Condition Table
Table 4. Stream conditions during fall trap operation.
Year
Fall Monitoring
Air Temp. (°C)
Water Temp. (°C)
pH .
DO (mg/L)
TDS (ppm)
Water Level (m)
Mean
SD
Mean
SD
Mean
SD
Mean
SD
Mean
SD
Mean
SD
2008
6.3
3.0
8.8
1.3
7.3
0.4
10.5
0.4
120.2
30.9
0.4
0.1
2009
6.8
3.3
8.7
1.9
7.6
0.2
10.6
1.9
105.0
28.7
0.5
0.2
2010
4.9
4.7
7.9
2.7
7.0
0.2
9.5
0.9
110.9
31.1
0.6
0.9
2011
4.9
3.0
7.0
1.8
7.3
0.6
9.7
0.5
112.7
30.1
0.3
0.3
2012
5.9
3.2
7.8
1.7
7.5
0.2
10.8
1.6
116.1
29.6
0.4
0.2
2013
6.1
3.1
8.0
2.0
7.7
0.1
10.5
0.7
119.8
30.6
0.3
0.1
2014
7.3
5.0
9.6
3.2
7.9
0.2
10.0
1.2
85.3
29.8
0.3
0.1
2015
6.0
4.3
8.5
3.0
8.2
0.2
10.2
2.1
97.1
29.5
0.3
0.2
2016
7.8
3.1
9.3
1.8
8.1
1.3
9.3
1.3
54.0
9.2
0.5
0.2
2017
4.8
3.3
8.4
1.9
8.1
0.7
12.8
1.4
101.8
38.2
0.3
0.2
2018
6.4
3.5
9.2
1.9
7.9
0.3
10.4
0.6
88.8
29.0
0.3
0.1
2019
5.2
3.8
8.2
2.3
7.6
0.1
11.5
1.0
103.9
26.6
0.2
0.1
2022
6.9
4.9
8.4
2.5
7.8
0.2
10.1
-
126.9
83.3
0.2
0.6
2023
8.3
5.4
9.6
2.4
7.8
0.2
10.7
0.7
66.4
66.1
0.2
0.1
2024
-
-
-
-
-
-
-
-
-
-
-
-
2.3. Annual Captures
Since 2008, a total of 5,046 juvenile CCT and 8,216 juvenile Coho
Salmon have been captured during spring trapping. Annual captures of CCT
have ranged from 45 to 849 (mean = 360) while CO captures have varied
from 335 to 913 with an overall mean of 587 fish (Figure 3 and Figure 4,
Table 5 and Table 6).
As expected, most fish are captured in the Spring. Catches of CCT
have ranged from 45 to 849 during spring (mean = 360 \(\pm\) 276.5) compared to only 1 to 9 fish
during fall (mean = 2 \(\pm\) 2.8).
Annual Captures Figures and Tables
Table 5. Spring - Total annual catches
**Table 5. Spring capture summary - capture timing, total captures and length of CCT and Coho Salmon.**
CCT
Coho Salmon
Total
Sample Period
Capture Timing
Fork Length (mm)
Capture Timing
Fork Length (mm)
(CT+CO)
Year
Start
End
# Days Sampled
Med.
Min
Max
n
Mean
SD
Min
Max
Med.
Min
Max
n
Mean
SD
Min
Max
n
2008
Apr-21
May-31
41
May-20
Apr-21
May-31
756
139.1
27.6
90
280
May-17
Apr-25
May-31
512
118.1
10.7
84.0
150
1268
2009
Apr-19
Jun-07
50
May-16
Apr-20
Jun-03
225
163.3
22.9
115
265
May-20
Apr-24
Jun-07
658
100.2
11.0
11.0
160
883
2010
Apr-19
May-30
42
May-13
Apr-19
May-29
502
149.7
26.1
110
285
May-13
Apr-20
May-30
477
118.0
15.7
80.0
183
979
2011
Apr-19
Jun-06
49
May-15
Apr-23
Jun-05
624
155.3
32.5
95
400
May-17
Apr-20
Jun-06
602
113.1
12.8
80.0
147
1226
2012
Apr-16
Jun-04
50
May-08
Apr-23
Jun-01
465
160.1
33.7
80
335
May-13
Apr-16
Jun-04
689
107.8
12.4
75.0
145
1154
2013
Apr-14
Jun-01
49
May-09
Apr-16
May-30
461
161.4
26.5
95
350
May-12
Apr-15
Jun-01
913
106.7
9.9
83.0
150
1374
2014
Apr-24
Jun-07
45
May-09
Apr-27
Jun-02
76
142.1
29.2
70
310
May-12
Apr-26
Jun-05
376
103.2
12.4
80.0
223
452
2015
Apr-10
May-31
52
May-09
Apr-15
May-28
141
158.1
37.4
85
260
May-13
Apr-11
May-31
761
109.3
11.7
78.0
152
902
2016
Apr-03
Jun-04
63
Apr-26
Apr-05
May-15
77
147.5
37.4
88
250
May-05
Apr-05
Jun-04
817
108.0
13.4
0.0
162
894
2017
Apr-05
Jun-11
68
May-24
Apr-20
Jun-09
65
185.1
64.0
120
470
May-20
Apr-05
Jun-11
335
113.4
12.8
80.0
162
400
2018
Apr-21
Jun-11
52
May-04
Apr-26
May-27
45
167.4
28.2
120
230
May-19
Apr-21
Jun-11
647
101.4
11.1
9.0
170
692
2019
Apr-18
Jun-07
51
May-06
Apr-18
May-30
571
146.1
27.6
95
260
May-13
Apr-24
Jun-05
405
115.4
12.9
10.7
152
976
2022
Apr-28
Jun-13
47
May-19
Apr-29
Jun-13
189
168.5
33.6
98
430
May-21
Apr-28
Jun-10
366
113.7
13.0
80.0
170
555
2024
Apr-12
Jun-05
55
Apr-29
Apr-17
Jun-03
849
159.8
37.1
50
360
May-10
Apr-18
Jun-04
658
97.5
17.6
48.0
174
1507
Table 6. Fall - Total annual catches
**Table 6. Fall capture summary - capture timing, total captures and length of CCT and Coho Salmon.**
CCT
Coho Salmon
Sample Period
Capture Timing
Fork Length (mm)
Capture Timing
Fork Length (mm)
Year
Start
End
# Days Sampled
Med.
Min
Max
n
Mean
SD
Min
Max
Med.
Min
Max
n
Mean
SD
Min
Max
2008
Oct-14
Nov-22
40
Nov-03
Nov-03
Nov-03
1
440.0
-
440
440
Nov-02
Oct-31
Nov-03
5
638.0
78.9
540
720
2009
Oct-14
Nov-22
40
-
-
-
0
-
-
-
-
Nov-03
Oct-17
Nov-18
12
648.3
84.1
490
790
2010
Oct-23
Nov-26
35
Nov-11
Nov-11
Nov-11
1
290.0
-
290
290
Oct-25
Oct-24
Nov-22
37
640.1
91.5
405
780
2011
Oct-18
Dec-02
46
-
-
-
0
-
-
-
-
Nov-12
Oct-26
Nov-23
30
650.5
82.9
370
795
2012
Oct-14
Dec-02
50
Oct-28
Oct-28
Oct-28
1
580.0
-
580
580
Nov-01
Oct-14
Nov-20
17
583.2
107.1
300
690
2013
Sep-29
Dec-01
62
-
-
-
0
-
-
-
-
Nov-06
Nov-02
Nov-18
83
631.7
59.7
490
790
2014
Oct-04
Nov-30
58
Oct-28
Oct-28
Oct-28
1
430.0
-
430
430
Oct-28
Oct-15
Nov-27
91
627.8
87.8
330
830
2015
Oct-08
Dec-08
62
-
-
-
0
-
-
-
-
Nov-08
Oct-12
Dec-02
77
600.0
89.4
350
750
2016
Oct-07
Dec-05
60
-
-
-
0
-
-
-
-
Nov-01
Oct-24
Nov-17
9
632.8
77.9
510
750
2017
Oct-11
Dec-05
56
Nov-19
Nov-19
Nov-19
1
470.0
-
470
470
Nov-15
Oct-18
Dec-04
19
592.4
133.3
330
770
2018
Oct-08
Dec-04
58
Nov-01
Nov-01
Nov-01
1
330.0
-
330
330
Nov-14
Oct-26
Nov-28
25
605.5
91.0
380
790
2019
Oct-08
Dec-10
64
Oct-16
Oct-16
Oct-16
1
390.0
-
390
390
Oct-25
Oct-16
Nov-17
22
566.8
110.2
340
710
2022
Oct-11
Nov-16
37
-
-
-
0
-
-
-
-
Nov-03
Oct-24
Nov-06
125
612.7
97.5
220
750
2023
Sep-26
Nov-17
45
Nov-02
Nov-02
Nov-16
9
239.1
108.9
152
430
Oct-18
Oct-11
Nov-16
272
571.3
96.5
220
740
2.4 Length Frequency
The length frequency figures shown below shed light on the population
structure and behaviours of Coho Salmon and CCT in Simms Creek. The
lengths of CCT (50 mm to 223 mm) and Coho Salmon (48 mm to 223 mm)
measured at the fence suggest multiple age classes of juveniles are
moving out of the system each spring. Assuming that CO <100 mm are
Age 0 and CO >100 mm are Age 1 would suggest that 55.20% of all
overall migrants are Age 0 and the remainder are Age 1. A wider range of
age classes is likely present among CCT, including Age 0 fish (~<80
mm) up to mature fish > 230 mm and upwards of 3+ years.
Mature CCT >230 mm represent <1.90% of the total catch of CCT.
However, all mature CCT >230 mm were moving downstream, suggesting
that they either 1) moved upstream and spawned prior to the start of
fence operation or 2) had overwintered in Simms Creek and were follow
fry out in the spring - whether this was their first movement to the
ocean is unknown.
Length Frequency Table and Figures
2.5 Age Composition
No scale data has been collected during juvenile enumeration work on
Simms Creek. However, information collected on systems within the region
suggests we can loosely apply the following age classes to juvenile CT
and CO:
CT < 80 ~ Age-0
CT < 120 ~ Age-1
CT < 200 ~ Age-2
CT > 200 ~ Age-2+
CO < 80 ~ Age-0
CO < 120 ~ Age-1
CO > 120 ~ Age-1+
Applying these age bins to the length frequency data suggests that
CCT are range in age from Age-1 to Age 3+, but are primarily Age-2
(Figure 9), while CO are almost exclusively Age-1 (Figure 10).
Interestingly, Age-0 CO were present in 2009 and 2024, but not other
years. While this may be coincidental, it’s worth noting that the peak
juvenile CCT counts were recorded in 2008 and 2024. There are a number
of mechanisms that may explain why Age-0 CO were first observed in 2024:
1) they weren’t recorded in past years, CO emigrated out of Simms Creek
earlier than normal due to high CT abundance.
Figure 10. Size by age class across years.
2.6. Migration Timing
2.4.1 Spring Outmigration
Outmigrating juvenile CCT and Coho Salmon were first encountered at
the trap over a similar period, from October 16 to November 19 (mean
\(\pm\) SD = November 01 \(\pm\) 10.1 days) for CCT and October 11 to
November 02 for Coho (mean \(\pm\) SD =
October 20 \(\pm\) 7 days). On average
50% of all CCT had passed the fence by November 02\(\pm\) 10.1 days while half of Coho Salmon
migrants had passed the fence by November 05\(\pm\) 8 days. Despite similarities in when
migrations started and the timing that most migrants had past the fence,
there was a noticeable difference in the timing of peak migrations (the
date when the greatest number of fish passed the fence). For Coastal
CCT, the overall mean \(\pm\) SD peak
migration occurred on November 01(\(\pm\) 10.1 days) (Figure 5) whereas overall
mean peak Coho Salmon migration occurred more than a week later on
October 30 (\(\pm\) 11.4 days) (Figure
6). Total number of daily captures of CCT and Coho Salmon per year are
presented in Figure 6 and Figure 7, respectively.
2.4.2 Fall Return Timing
Adult Coho Salmon have been detected at the fence as early as October
11 and as late as November 02, though most of the run (50%) arrive
within a week of November 05 (Figure 14 to 19). Relative to spring
sampling, CCT are encountered less frequently in the fall and arrival
timing appears to be considerably more variable (Figure 20 to 22).
Spring and Fall Migration Timing Tables and Figures
2.6 What are these fish doing???
CCT show incredible diversity in the timing of their life history
behaviours. Throughout their range, spawning has been documented in
nearly every month of the year. In Puget Sound for instance, spawning
has been reported from November through March and timing is highly
variable between years (Losee
et al. 2016 ). The spawn timing of CCT in Simms Creek is unknown, or
at least undocumented, however, I would assume it occurs during a
similar period to Puget Sound and is equally variable.
The current dataset does provide some insight on spawn timing.
Presumably, spawners will be >150 mm in length.
LS0tDQp0aXRsZTogIlNpbW1zRmlzaEZlbmNlIg0KYXV0aG9yOiAiRXJpYyBWIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogZmxhdGx5ICMgZGVmYXVsdCwgY2VydWxlYW4sIGpvdXJuYWwsIGZsYXRseSwgZGFya2x5LCByZWFkYWJsZSwgc3BhY2VsYWIsIHVuaXRlZCwgY29zbW8sIGx1bWVuLCBwYXBlciwgc2FuZHN0b25lLCBzaW1wbGV4LCBhbmQgeWV0aQ0KICAgIGhpZ2hsaWdodDogdGFuZ28gIyBkZWZhdWx0LCB0YW5nbywgcHlnbWVudHMsIGthdGUsIG1vbm9jaHJvbWUsIGVzcHJlc3NvLCB6ZW5idXJuLCBoYWRkb2NrLCBicmVlemVkYXJrLCBhbmQgdGV4dG1hdGUNCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICAgIGNvZGVfZm9sZGVyOiBzaG93DQogICAgc21hcnQ6IHRydWUNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IA0KICAgICAgdG9jX2RlcHRoOiAxDQogIGZsZXhkYXNoYm9hcmQ6OmZsZXhfZGFzaGJvYXJkOg0KICAgIG9yaWVudGF0aW9uOiBjb2x1bW5zDQogICAgdmVydGljYWxfbGF5b3V0OiBzY3JvbGwgDQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB5ZXMgIA0KDQoNCiNiaWJsaW9ncmFwaHk6IGJpb2JsaW9ncmFwaHkuYmliDQogICAgDQotLS0NCg0KYGBge3Igb2xkIHlhbWwsIGluY2x1ZGUgPSBGQUxTRX0NCg0KDQojIDwhLS0gICBmbGV4ZGFzaGJvYXJkOjpmbGV4X2Rhc2hib2FyZDogLS0+DQojIDwhLS0gICAgIG9yaWVudGF0aW9uOiBjb2x1bW5zIC0tPg0KIyA8IS0tICAgICB2ZXJ0aWNhbF9sYXlvdXQ6IHNjcm9sbCAtLT4NCiMgPCEtLSAgIGh0bWxfbm90ZWJvb2s6IC0tPg0KIyA8IS0tICAgICB0b2M6IHRydWUgLS0+DQojIDwhLS0gICB3b3JkX2RvY3VtZW50OiAtLT4NCiMgPCEtLSAgICAgdG9jOiB0cnVlIC0tPg0KIyA8IS0tIGVkaXRvcl9vcHRpb25zOiAtLT4NCiMgPCEtLSAgIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUgLS0+DQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFKQ0KDQpgYGANCg0KIyAxLiBJbnRyb2R1Y3Rpb24NCg0KU2ltbXMgQ3JlZWsgaXMgYSBzbWFsbCwgM3JkIG9yZGVyIHN0cmVhbSB0aGF0IGRyYWlucyBhbiBhcmVhIG9mIFx+MSw4MDAgaGEgaW50byB0aGUgU2FsaXNoIFNlYSwgbmVhciBDYW1wYmVsbCBSaXZlcidzIFdpbGxvdyBQb2ludCBuZWlnaGJvcmhvb2QuIFRoZSBsb3dlciByZWFjaCBvZiBTaW1tcyBDcmVlayAoXH4zIGttIG9mIGNoYW5uZWwsIGVhc3Qgb2YgRG9nd29vZCBTdHJlZXQpLCBpcyBjb250YWluZWQgd2l0aGluIGEgbmFycm93IHVyYmFuIGdyZWVuIHdheSB0aGF0IGlzIGJvcmRlcmVkIGJ5IHJlc2lkZW50aWFsIHByb3BlcnRpZXMuIEZyb20gRG9nd29vZCBTdHJlZXQgUm9hZCB0aGUgc3RyZWFtcyBydW5zIGZvciB+IDIga20gdG8gdGhlIElubGFuZCBIaWdod2F5IGFuZCBpcyBwcm90ZWN0ZWQgd2l0aGluIFtCZWF2ZXIgTG9kZ2UgTGFuZHNdKGh0dHBzOi8vY2FtcGJlbGxyaXZlci50cmF2ZWwvbmV3cy9mb3Jlc3RyeS1ndWlkZS10by1iZWF2ZXItbG9kZ2UtbGFuZHMvKSwgdXBzdHJlYW0gb2YgdGhlIElubGFuZCBIaWdod2F5LCBcPjEuNSBrbSBvZiB0cmlidXRhcnkgY2hhbm5lbCBpcyBsb2NhdGVkIHdpdGhpbiBwcml2YXRlIGZvcmVzdCBsYW5kcyBpbiB2YXJpb3VzIHN0YWdlcyBvZiByZWdlbmVyYXRpb24uDQoNCkNodW0sIENoaW5vb2ssIFBpbmsgYW5kIENvaG8gc2FsbW9uIGhhdmUgYWxsIGJlZW4gb2JzZXJ2ZWQgaW4gU2ltbXMgQ3JlZWssIGFzIHdlbGwgYXMgQ29hc3RhbCBDdXR0aHJvYXQgVHJvdXQgKENDVCksIFJhaW5ib3cgVHJvdXQgYW5kIHN0ZWVsaGVhZC4gTW9yZSByZWNlbnQgbW9uaXRvcmluZyAoaS5lLiwgdGhpcyBkYXRhc2V0KSwgc3VnZ2VzdCB0aGF0IENvaG8gU2FsbW9uIChDTykgYW5kIENDVCBhcmUgdGhlIHByaW1hcnkgc3BlY2llcyB3aXRoaW4gU2ltbXMgQ3JlZWssIGJvdGggb2Ygd2hpY2ggYXJlIHByZXNlbnQgd2l0aGluIHRoZSBzdHJlYW0geWVhciByb3VuZCAtIHRob3VnaCBhIHNtYWxsIG51bWJlciBvZiBqdXZlbmlsZSBDaGlub29rIFNhbG1vbiB3ZXJlIGlkZW50aWZpZWQgaW4gMjAyNC4NCg0KW0dyZWVud2F5cyBMYW5kIFRydXN0XShodHRwczovL3d3dy5ncmVlbndheXN0cnVzdC5jYS8pIGhhcyBzdXBwb3J0ZWQgU2ltbXMgQ3JlZWsgU3Rld2FyZHMgZm9yICsyMCB5ZWFycywgaW5jbHVkaW5nIG9wZXJhdGlvbiBvZiBhIGZpc2ggZmVuY2UgbmVhciB0aGUgbW91dGggb2YgdGhlIHN0cmVhbSBzaW5jZSAyMDA4LiBKdXZlbmlsZSBhbmQgYWR1bHQgZmlzaCBtb3ZpbmcgcGFzdCB0aGUgZmVuY2UgYXJlIHRhbGxpZWQgZWFjaCBzcHJpbmcgYW5kIGZhbGwsIHJlc3BlY3RpdmVseS4gVGhlIG9iamVjdGl2ZSBvZiB0aGlzIHByb2plY3QgaXMgdG8gZXhwbG9yZSB0aGUganV2ZW5pbGUgZmVuY2UgZGF0YXNldC4gQWxsIHdvcmsgaXMgYmVpbmcgZG9uZSBzdHJpY3RseSBmb3IgZnVuIGFuZCBvdXQgb2YgcGVyc29uYWwgY3VyaW9zaXR5LiBBbnkgZmVlZGJhY2ssIGlucHV0LCBvciBzdXBwb3J0IGlzIHdlbGNvbWUuIEFsc28sIEkgaGF2ZSBhIHNvZnQgc3BvdCBmb3IgQ0NULCBzbyBiZSB3YXJuZWQgdGhhdCBlZmZvcnQgYW5kIHJlc3VsdHMgd2lsbCBiZSBzbGlnaHRseSB0cm91dCBiaWFzZWQuIExldCdzIHRha2UgYSBsb29rIGF0IHdoYXQgaGFzIGJlZW4gY29tcGxldGVkIHRvIGRhdGUuIEl0J3MgYSB0cmVtZW5kb3VzIGFtb3VudCBvZiB3b3JrIGFuZCBhbGwgdm9sdW50ZWVycyBhbmQgc3VwcG9ydGVycyBzaG91bGQgYmUgY29tbWVuZGVkIQ0KDQoNCg0KYGBge3IgMS4gTG9hZCBhbmQgRm9ybWF0IERhdGEsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQojIyBDbGVhciB3b3Jrc3BhY2UgIyMNCiMgcm0obGlzdCA9IGxzKCkpICANCg0KIyAjIyBMb2FkIFByZXBwZWQgRGF0YQ0KIyBzb3VyY2UoIlNvdXJjZUZpbGVzLzAuIFJ1blNvdXJjZUZpbGVzLlIiKQ0KIyANCiAgc291cmNlKCJTb3VyY2VGaWxlcy8xLiBMb2FkIGFuZCBQcmVwIERhdGEuUiIpDQojIA0KIyAjIyBMb2FkIFRyYXAgRWZmb3J0IERhdGENCiBzb3VyY2UoIlNvdXJjZUZpbGVzLzIuIFRyYXBwaW5nIEVmZm9ydC5SIikNCg0KYGBgDQoNCmBgYHtyIGRvd25sb2FkIGRhdGF9DQpkYXRhX2FsbCAlPiUNCmRvd25sb2FkX3RoaXMoDQogICAgb3V0cHV0X25hbWUgPSAiUmF3IEZlbmNlIERhdGEiLA0KICAgIG91dHB1dF9leHRlbnNpb24gPSAiLmNzdiIsDQogICAgYnV0dG9uX2xhYmVsID0gIkRvd25sb2FkIEZlbmNlIERhdGEgKC5jc3YpIiwNCiAgICBidXR0b25fdHlwZSA9ICJkZWZhdWx0IiwNCiAgICBoYXNfaWNvbiA9IFRSVUUsDQogICAgaWNvbiA9ICJmYSBmYS1zYXZlIg0KICApDQoNCnNpbW1zX2VudiAlPiUNCmRvd25sb2FkX3RoaXMoDQogICAgb3V0cHV0X25hbWUgPSAiUmF3IEZlbmNlIERhdGEiLA0KICAgIG91dHB1dF9leHRlbnNpb24gPSAiLmNzdiIsDQogICAgYnV0dG9uX2xhYmVsID0gIkRvd25sb2FkIEVudmlyb21lbnRhbCBEYXRhICguY3N2KSIsDQogICAgYnV0dG9uX3R5cGUgPSAiZGVmYXVsdCIsDQogICAgaGFzX2ljb24gPSBUUlVFLA0KICAgIGljb24gPSAiZmEgZmEtc2F2ZSINCiAgKQ0KYGBgDQoNCg0KIyAyLiBGZW5jZSBPcGVyYXRpb24NCg0KIyMjIDIuMS4gTW9uaXRvcmluZyBFZmZvcnQgey50YWJzZXQgLnRhYnNldC1kcm9wZG93bn0NClRoZSBTaW1tcyBDcmVlayBmaXNoIGZlbmNlIGhhcyBvcGVyYXRlZCBhbm51YWxseSBzaW5jZSAyMDA4LCB3aXRoIHRoZSBleGNlcHRpb24gb2YgMjAyMCBhbmQgMjAyMSB3aGVuIG9wZXJhdGlvbnMgd2VyZSBwYXVzZWQgZHVlIHRvIHRoZSBDT1ZJRC0xOSBQYW5kZW1pYyBhbmQgaW4gdGhlIHNwcmluZyBvZiAyMDIzIHdoZW4gZmVkZXJhbCBlbXBsb3llZXMgd2VyZSBvbiBzdHJpa2UuDQoNClNwcmluZyBzdXJ2ZXlzIHRhcmdldCBvdXQgbWlncmF0aW5nIGp1dmVuaWxlIENvaG8gU2FsbW9uIGJ1dCBhbHNvIGNhcHR1cmUgYW4gaW1wcmVzc2l2ZSBudW1iZXIgb2YgQ0NUIGFuZCBoYXZlIGV2ZW4gY2FwdHVyZWQgc29tZSBDaGlub29rIFNhbG1vbi4gU3ByaW5nIGZlbmNlIG1vbml0b3JpbmcgaGFzIHN0YXJ0ZWQgYXMgZWFybHkgYXMgYHIgZm9ybWF0KG1pbih0cmFwX3Bsb3QkZGF0ZS5zdGRbdHJhcF9wbG90JFBlcmlvZD09IlNwcmluZyJdKSwgIiVCICVkIilgLCBob3dldmVyLCBtb3N0IHN1cnZleXMgKDUwJSkgZG9uJ3Qgc3RhcnQgdW50aWwgYHIgZm9ybWF0KG1pbih0cmFwX3Bsb3QkZGF0ZS5zdGRbdHJhcF9wbG90JFBlcmlvZD09IlNwcmluZyIgJiB0cmFwX3Bsb3QkcHJvcC5zYW1wbGVkID49IDAuNV0pLCAiJUIgJWQiKWAuIEluIGVhY2ggbW9uaXRvcmluZyB5ZWFyLCB0aGUgZmVuY2UgaGFzIG9wZXJhdGVkIGNvbnRpbnVvdXNseSAoZS5nLiwgc2FtcGxpbmcgb2NjdXJyZWQgYXQgbGVhc3QgZGFpbHkpIGZyb20gYHIgZm9ybWF0KG1pbih0cmFwX3Bsb3QkZGF0ZS5zdGRbdHJhcF9wbG90JFBlcmlvZD09IlNwcmluZyIgJiB0cmFwX3Bsb3QkcHJvcC5zYW1wbGVkID09IDEuMF0pLCAiJUIgJWQiKWAgdG8gYHIgZm9ybWF0KG1heCh0cmFwX3Bsb3QkZGF0ZS5zdGRbdHJhcF9wbG90JFBlcmlvZD09IlNwcmluZyIgJiB0cmFwX3Bsb3QkcHJvcC5zYW1wbGVkID09IDEuMF0pLCAiJUIgJWQiKWAuIFN1cnZleXMgaGF2ZSBjb250aW51ZWQgYXMgbGF0ZSBhcyBgciBmb3JtYXQobWF4KHRyYXBfcGxvdCRkYXRlLnN0ZFt0cmFwX3Bsb3QkUGVyaW9kPT0iU3ByaW5nIl0pLCAiJUIgJWQiKWAsIGJ1dCBtb3N0ICg1MCUpIGFyZSB0ZXJtaW5hdGVkIGJ5IGByIGZvcm1hdChtYXgodHJhcF9wbG90JGRhdGUuc3RkW3RyYXBfcGxvdCRQZXJpb2Q9PSJTcHJpbmciICYgdHJhcF9wbG90JHByb3Auc2FtcGxlZD09MC41XSksICIlQiAlZCIpYC4NCg0KRmFsbCBzdXJ2ZXlzIHRvIGNvdW50IHRoZSBudW1iZXIgcmV0dXJuaW5nIGFkdWx0IENvaG8sIENoaW5vb2ssIENodW0gYW5kIFBpbmsgU2FsbW9uIGFuZCBhbHNvIGludGVyY2VwdCBhIHNtYWxsIG51bWJlciBvZiBDQ1QuIEluIHRoZSBmYWxsLCBzdXJ2ZXlzIGhhdmUgc3RhcnRlZCBhcyBlYXJseSBhcyBgciBmb3JtYXQobWluKHRyYXBfcGxvdCRkYXRlLnN0ZFt0cmFwX3Bsb3QkUGVyaW9kPT0iRmFsbCJdKSwgIiVCICVkIilgLCBob3dldmVyLCBtb3N0IHN1cnZleXMgKDUwJSkgaGF2ZSBzdGFydGVkIG9uIGByIGZvcm1hdChtaW4odHJhcF9wbG90JGRhdGUuc3RkW3RyYXBfcGxvdCRQZXJpb2Q9PSJGYWxsIiAmIHRyYXBfcGxvdCRwcm9wLnNhbXBsZWQgPj0gMC41XSksICIlQiAlZCIpYC4gSW4gZWFjaCBtb25pdG9yaW5nIHllYXIsIHN1cnZleXMgaGF2ZSBvY2N1cnJlZCBjb250aW51b3VzbHkgKGUuZy4sIHNhbXBsaW5nIG9jY3VycmVkIGRhaWx5KSBmcm9tIGByIGZvcm1hdChtaW4odHJhcF9wbG90JGRhdGUuc3RkW3RyYXBfcGxvdCRQZXJpb2Q9PSJGYWxsIiAmIHRyYXBfcGxvdCRwcm9wLnNhbXBsZWQgPT0gMS4wXSksICIlQiAlZCIpYCB0byBgciBmb3JtYXQobWF4KHRyYXBfcGxvdCRkYXRlLnN0ZFt0cmFwX3Bsb3QkUGVyaW9kPT0iRmFsbCIgJiB0cmFwX3Bsb3QkcHJvcC5zYW1wbGVkID09IDEuMF0pLCAiJUIgJWQiKWAuIFN1cnZleXMgaGF2ZSBjb250aW51ZWQgYXMgbGF0ZSBhcyBgciBmb3JtYXQobWF4KHRyYXBfcGxvdCRkYXRlLnN0ZFt0cmFwX3Bsb3QkUGVyaW9kID09IkZhbGwiXSksICIlQiAlZCIpYCBhbmQgbm8gc3VydmV5cyBoYXZlIG9jY3VycmVkIGxhdGVyIHRoYW4gYHIgZm9ybWF0KG1heCh0cmFwX3Bsb3QkZGF0ZS5zdGRbdHJhcF9wbG90JFBlcmlvZD09IkZhbGwiICYgdHJhcF9wbG90JHByb3Auc2FtcGxlZCA+PSAwLjVdKSwgIiVCICVkIilgLg0KDQoNCiMjIyMgTW9uaXRvcmluZyBFZmZvcnQgVGFibGVzIGFuZCBGaWd1cmVzDQoNCiMjIyMgVGFibGUgMS4gU2FtcGxpbmcgU3VtbWFyeQ0KYGBge3IgMi4gVHJhcCBFZmZvcnQgU3VtbWFyeSBUYWJsZSAsIGZpZy5jYXAgPSAiVGFibGUgMS4gU3VtbWFyeSBvZiBzcHJpbmcgYW5kIGZhbGwgc2FtcGxpbmcgZWZmb3J0LiIsIGZpZy50b3BjYXB0aW9uID0gVFJVRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KDQprYWJsZSh0cmFwX2VmZm9ydF9zdW1tYXJ5X3RhYmxlLA0KICAgICAgImh0bWwiLA0KICAgICAgYm9va3RhYnMgPSBULA0KICAgICAgDQogICAgICBhbGlnbiA9IGMoImMiKSwNCiAgICAgIGNvbC5uYW1lcyA9IGMoIlBlcmlvZCIsIk1pbiIsIk1heCIsICJNZWFuIiwgIlNEIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbiIsIk1heCIsICJNZWFuIiwgIlNEIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbiIsIk1heCIsICJNZWFuIiwgIlNEIiksDQogICAgICBjYXB0aW9uID0gIlRhYmxlIDEuIEFubnVhbCBzcHJpbmcgdHJhcCBvcGVyYXRpb24gcGVyaW9kcy4iLA0KICAgICAgZGlnaXRzID0gMSkgJT4lDQogICAgDQogICAgICBrYWJsZV9zdHlsaW5nKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9ICBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICJjZW50ZXIiLCANCiAgICAgICAgICAgICAgICAgICAgICBmb250X3NpemUgPSAxMiwNCiAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFRSVUUpICU+JQ0KICAgICAgICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwgIiMgRGF5cyBTYW1wbGVkIiA9IDQsICJTdGFydCBEYXRlIiA9IDQsICJFbmQgRGF0ZSI9NCkpDQoNCmBgYA0KDQoNCiMjIyMgVGFibGUgMi4gQW5udWFsIFNwcmluZyBhbmQgRmFsbCBUcmFwIE9wZXJhdGlvbiBQZXJpb2RzDQpgYGB7ciAyLiBUcmFwIEVmZm9ydCBUYWJsZSB0cmFwIGVmZm9ydCB0YWJsZSwgZmlnLmNhcCA9ICJUYWJsZSAyLiBBbm51YWwgc3ByaW5nIGFuZCBmYWxsIHRyYXAgb3BlcmF0aW9uIHBlcmlvZHMuIiwgZmlnLnRvcGNhcHRpb24gPSBUUlVFLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoNCg0KIyMgS2FibGUgLSBNYXN0ZXIgU3VtbWFyeSAtLS0tDQpvcHRpb25zKGtuaXRyLmthYmxlLk5BID0gJy0nKQ0KICAgIA0KDQogICAga2FibGUodHJhcF9lZmZvcnRfdGFibGUsDQogICAgICAiaHRtbCIsDQogICAgICBib29rdGFicyA9IFQsDQogICAgICANCiAgICAgIGFsaWduID0gYygiYyIpLA0KICAgICAgY29sLm5hbWVzID0gYygiWWVhciIsICIjIERheXMgU2FtcGxlZCIsICJTdGFydCIsICJFbmQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIyBEYXlzIFNhbXBsZWQiLCAiU3RhcnQiLCAiRW5kIiksDQogICAgICBjYXB0aW9uID0gIlRhYmxlIDIuIEFubnVhbCBzcHJpbmcgYW5kIGZhbGwgdHJhcCBvcGVyYXRpb24gcGVyaW9kcy4iLA0KICAgICAgDQogICAgICBkaWdpdHMgPSAxKSAlPiUNCiAgY29sdW1uX3NwZWMoYygyLDUpLCB3aWR0aCA9ICIyY20iKSAlPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSAgRkFMU0UsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSAiY2VudGVyIiwgDQogICAgICAgICAgICAgICAgZm9udF9zaXplID0gMTIsDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBUUlVFKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsICJTcHJpbmcgU2FtcGxpbmciID0gMywgIkZhbGwgU2FtcGxpbmciID0gMykpDQpgYGANCg0KDQo8IS0tICoqYHIgZmlnX251bXMoImZhbGwudHJhcC5wbG90IiwgIkZhbGwgdHJhcCBvcGVyYXRpb24gcGVyaW9kLCBwcmVzZW50ZWQgYXMgdGhlIHByb3BvcnRpb24gb2Ygc2FtcGxlIHllYXJzIGVhY2ggZGF0ZSBoYXMgYmVlbiB0cmFwcGVkIHNpbmNlIDIwMDggKGV4Y2x1ZGluZyB5ZWFycyB3aGVuIHRyYXBwaW5nIGRpZCBub3Qgb2NjdXIgZHVlIHRvIENPVklEIG9yIGdvdmVybm1lbnQgc3RyaWtlcykuIilgKiogLS0+DQoNCg0KDQpgYGB7ciAzLiBTdHJlYW0gQ29uZGl0aW9ucyAtIExvYWQgRGF0YSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KDQojIyBMb2FkIFN0cmVhbSBDb25kaXRpb25zIERhdGEgDQogc291cmNlKCJTb3VyY2VGaWxlcy8zLiBTdHJlYW0gQ29uZGl0aW9ucy5SIikNCg0KYGBgDQoNCiMjIyAyLjIgU3RyZWFtIENvbmRpdGlvbnMgey50YWJzZXQgLnRhYnNldC1kcm9wZG93bn0NCg0KRHVyaW5nIGVhY2ggZGFpbHkgdHJhcCB2aXNpdCwgdm9sdW50ZWVycyByZWNvcmQgbWVhc3VyZXMgb2Ygd2F0ZXIgdGVtcGVyYXR1cmUsIHBILCBUb3RhbCBTdXNwZW5kZWQgU2VkaW1lbnQgKFRTUyksIGRpc3NvbHZlZCBveHlnZW4sIGFuZCB3YXRlciBsZXZlbCAoc3RhZ2UpLiBNZWFuIGFubnVhbCBtZWFzdXJlcyBvZiBlYWNoIHBhcmFtZXRlciBhcmUgcHJlc2VudGVkIGJlbG93IGZvciB0aGUgc3ByaW5nIGFuZCBmYWxsIG1vbml0b3JpbmcgcGVyaW9kcyAoVGFibGUgMyBhbmQgVGFibGUgNCwgRmlndXJlIDIpLiANCg0KIyMjIyBTdHJlYW0gQ29uZGl0aW9ucyBGaWd1cmVzIGFuZCBUYWJsZXMNCg0KIyMjIyBUYWJsZSAzLiBTcHJpbmcgQ29uZGl0aW9uIFRhYmxlDQpgYGB7ciAzLiBTdHJlYW0gQ29uZGl0aW9ucyAtIFNwcmluZyBUYWJsZSwgZmlnLmNhcCA9ICJUYWJsZSAzLiBPdmVyYWxsIGFubnVhbCBzdHJlYW0gY29uZGl0aW9ucyBkdXJpbmcgc3ByaW5nIHRyYXAgbW9uaXRvcmluZyBmcm9tIDIwMDggdG8gMjAyNC4iLCBmaWcudG9wY2FwdGlvbiA9IFRSVUUsZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KDQpjb25kX2RhdGFfd2lkZS5zcHJpbmcgPC0gY29uZF9kYXRhX3dpZGUgJT4lIHNlbGVjdCgxOjEzKQ0KDQojIyBLYWJsZSAtIFN0cmVhbSBDb25kaXRpb25zIC0tLS0NCm9wdGlvbnMoa25pdHIua2FibGUuTkEgPSAnLScpDQogICAgDQoNCiAgICBrYWJsZShjb25kX2RhdGFfd2lkZS5zcHJpbmcsDQogICAgICAiaHRtbCIsDQogICAgICBib29rdGFicyA9IFQsDQogICAgICANCiAgICAgIGFsaWduID0gYygiYyIpLA0KICAgICAgY29sLm5hbWVzID0gYygiICIsICJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiKSwNCiAgICAgIGNhcHRpb24gPSAiVGFibGUgMy4gU3RyZWFtIGNvbmRpdGlvbnMgZHVyaW5nIHNwcmluZyB0cmFwIG9wZXJhdGlvbi4iLA0KICAgICAgDQogICAgICBkaWdpdHMgPSAxKSAlPiUNCiAgY29sdW1uX3NwZWMoYygyLDUpLCB3aWR0aCA9ICIyY20iKSAlPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSAgRkFMU0UsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSAiY2VudGVyIiwgDQogICAgICAgICAgICAgICAgZm9udF9zaXplID0gMTIsDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBUUlVFKSAlPiUgDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLCAiQWlyIFRlbXAuIFxuKFx1MDBCMEMpIiA9IDIsICJXYXRlciBUZW1wLiBcbihcdTAwQjBDKSIgPSAyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwSCBcbi4gIiA9IDIsICJETyBcbihtZy9MKSIgPSAyLCAiVERTIFxuKHBwbSkiID0gMiwgIldhdGVyIExldmVsIFxuKG0pIiA9IDIpKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJZZWFyIj0gMSwgIlNwcmluZyBNb25pdG9yaW5nIiA9IDEyKSkgICAgDQoNCmBgYA0KDQojIyMjIFRhYmxlIDQuIEZhbGwgQ29uZGl0aW9uIFRhYmxlDQpgYGB7ciAzLiBTdHJlYW0gQ29uZGl0aW9ucyAtIEZhbGwgVGFibGUsIGZpZy5jYXAgPSAiVGFibGUgNC4gT3ZlcmFsbCBhbm51YWwgc3RyZWFtIGNvbmRpdGlvbnMgZHVyaW5nIGZhbGwgdHJhcCBtb25pdG9yaW5nIGZyb20gMjAwOCB0byAyMDI0LiIsIGZpZy50b3BjYXB0aW9uID0gVFJVRSxlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoNCmNvbmRfZGF0YV93aWRlLnNwcmluZyA8LSBjb25kX2RhdGFfd2lkZSAlPiUgc2VsZWN0KDEsIDE0OjI1KQ0KDQojIyBLYWJsZSAtIFN0cmVhbSBDb25kaXRpb25zIC0tLS0NCm9wdGlvbnMoa25pdHIua2FibGUuTkEgPSAnLScpDQogICAgDQoNCiAgICBrYWJsZShjb25kX2RhdGFfd2lkZS5zcHJpbmcsDQogICAgICAiaHRtbCIsDQogICAgICBib29rdGFicyA9IFQsDQogICAgICANCiAgICAgIGFsaWduID0gYygiYyIpLA0KICAgICAgY29sLm5hbWVzID0gYygiICIsICJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiLCJNZWFuIiwiU0QiKSwNCiAgICAgIGNhcHRpb24gPSAiVGFibGUgNC4gU3RyZWFtIGNvbmRpdGlvbnMgZHVyaW5nIGZhbGwgdHJhcCBvcGVyYXRpb24uIiwNCiAgICAgIA0KICAgICAgZGlnaXRzID0gMSkgJT4lDQogIGNvbHVtbl9zcGVjKGMoMiw1KSwgd2lkdGggPSAiMmNtIikgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gIEZBTFNFLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gImNlbnRlciIsIA0KICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSA9IDEyLA0KICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVFJVRSkgJT4lIA0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwgIkFpciBUZW1wLiBcbihcdTAwQjBDKSIgPSAyLCAiV2F0ZXIgVGVtcC4gXG4oXHUwMEIwQykiID0gMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicEggXG4uICIgPSAyLCAiRE8gXG4obWcvTCkiID0gMiwgIlREUyBcbihwcG0pIiA9IDIsICJXYXRlciBMZXZlbCBcbihtKSIgPSAyKSkgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiWWVhciI9IDEsICJGYWxsIE1vbml0b3JpbmciID0gMTIpKSAgICANCmBgYA0KDQoNCg0KIyMjIyBGaWd1cmUgMi4gU3ByaW5nIGFuZCBGYWxsIENvbmRpdGlvbiBQbG90DQpgYGB7ciAzLiBTdHJlYW0gQ29uZGl0aW9ucyAtIFBsb3QsIGZpZy5jYXAgPSAiRmlndXJlIDIuIEF2ZXJhZ2UgZGFpbHkgbWVhc3VyZXMgb2YgYWlyIGFuZCB3YXRlciB0ZW1wZXJhdHVyZSwgcEgsIGRpc3NvbHZlZCBveHlnZW4gKERPKSwgdG90YWwgZGlzc29sdmVkIHNvbGlkcyAoVERTKSBhbmQgd2F0ZXIgbGV2ZWwgKHN0YWdlKSBwZXIgbW9uaXRvcmluZyB5ZWFyIGluIHNwcmluZyBhbmQgZmFsbC4iLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gMTUsIGZpZy50b3BjYXB0aW9uID0gVFJVRX0NCg0KcHJpbnQoY29uZF9wbG90KQ0KYGBgDQoNCiMjIyAyLjMuIEFubnVhbCBDYXB0dXJlcyB7LnRhYnNldCAudGFic2V0LWRyb3Bkb3dufQ0KYGBge3IgNC4gRmlzaCBDYXB0dXJlcyAtIFN1bW1hcnkgVGFibGUgY2F0Y2hfZGF0LnByZXAsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgaW5jbHVkZSA9IEZBTFNFfQ0Kc291cmNlKCJTb3VyY2VGaWxlcy80LiBBbm51YWwgQ2FwdHVyZXMuUiIpDQpgYGANCg0KYGBge3IgNC4gRmlzaCBDYXB0dXJlcyAtIHZhbHVlcyBmb3IgdGV4dCwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9DQphbm51YWwuY2F0Y2hlcyA8LSBjYXRjaF9wbG90LmRhdGEgJT4lIGdyb3VwX2J5KFBlcmlvZCwgU3BlY2llcykgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcml6ZShtZWFuID0gcm91bmQobWVhbihuKSwwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IG1pbihuKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IG1heChuKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEICA9IHNkKG4pKQ0KYW5udWFsLmNhdGNoZXMuc3ByaW5nLkNUIDwtIGFubnVhbC5jYXRjaGVzICU+JSBmaWx0ZXIoUGVyaW9kID09ICJTcHJpbmciLCBTcGVjaWVzID09ICJDVCIpDQphbm51YWwuY2F0Y2hlcy5zcHJpbmcuQ08gPC0gYW5udWFsLmNhdGNoZXMgJT4lIGZpbHRlcihQZXJpb2QgPT0gIlNwcmluZyIsIFNwZWNpZXMgPT0gIkNPIikNCmFubnVhbC5jYXRjaGVzLmZhbGwuQ1QgPC0gYW5udWFsLmNhdGNoZXMgJT4lIGZpbHRlcihQZXJpb2QgPT0gIkZhbGwiLCBTcGVjaWVzID09ICJDVCIpDQphbm51YWwuY2F0Y2hlcy5mYWxsLkNPIDwtIGFubnVhbC5jYXRjaGVzICU+JSBmaWx0ZXIoUGVyaW9kID09ICJGYWxsIiwgU3BlY2llcyA9PSAiQ08iKQ0KYGBgDQoNCg0KDQpTaW5jZSAyMDA4LCBhIHRvdGFsIG9mIGByIGZvcm1hdChzdW0oY2F0Y2hfYW5udWFsLlRhYmxlLlNwcmluZyRuQ1QpLCBiaWcubWFyayA9IiwiKWAganV2ZW5pbGUgQ0NUIGFuZCBgciBmb3JtYXQoc3VtKGNhdGNoX2FubnVhbC5UYWJsZS5TcHJpbmckbkNPKSwgYmlnLm1hcmsgPSIsIilgIGp1dmVuaWxlIENvaG8gU2FsbW9uIGhhdmUgYmVlbiBjYXB0dXJlZCBkdXJpbmcgc3ByaW5nIHRyYXBwaW5nLiBBbm51YWwgY2FwdHVyZXMgb2YgQ0NUIGhhdmUgcmFuZ2VkIGZyb20gYHIgZm9ybWF0KG1pbihjYXRjaF9hbm51YWwuVGFibGUuU3ByaW5nJG5DVCksIGJpZy5tYXJrID0iLCIpYCB0byBgciBmb3JtYXQobWF4KGNhdGNoX2FubnVhbC5UYWJsZS5TcHJpbmckbkNUKSwgYmlnLm1hcmsgPSIsIilgIChtZWFuID0gYHIgZm9ybWF0KG1lYW4oY2F0Y2hfYW5udWFsLlRhYmxlLlNwcmluZyRuQ1QpLCBkaWdpdHMgPSAxKWApIHdoaWxlIENPIGNhcHR1cmVzIGhhdmUgdmFyaWVkIGZyb20gYHIgZm9ybWF0KG1pbihjYXRjaF9hbm51YWwuVGFibGUuU3ByaW5nJG5DTyksIGJpZy5tYXJrID0iLCIpYCB0byBgciBmb3JtYXQobWF4KGNhdGNoX2FubnVhbC5UYWJsZS5TcHJpbmckbkNPKSwgYmlnLm1hcmsgPSIsIilgIHdpdGggYW4gb3ZlcmFsbCBtZWFuIG9mIGByIGZvcm1hdChtZWFuKGNhdGNoX2FubnVhbC5UYWJsZS5TcHJpbmckbkNPKSwgZGlnaXRzID0gMSlgIGZpc2ggKEZpZ3VyZSAzIGFuZCBGaWd1cmUgNCwgVGFibGUgNSBhbmQgVGFibGUgNikuDQoNCkFzIGV4cGVjdGVkLCBtb3N0IGZpc2ggYXJlIGNhcHR1cmVkIGluIHRoZSBTcHJpbmcuIENhdGNoZXMgb2YgQ0NUIGhhdmUgcmFuZ2VkIGZyb20gYHIgYW5udWFsLmNhdGNoZXMuc3ByaW5nLkNUJG1pbmAgdG8gYHIgYW5udWFsLmNhdGNoZXMuc3ByaW5nLkNUJG1heGAgZHVyaW5nIHNwcmluZyAobWVhbiA9IGByIGFubnVhbC5jYXRjaGVzLnNwcmluZy5DVCRtZWFuYCAkXHBtJCBgciByb3VuZChhbm51YWwuY2F0Y2hlcy5zcHJpbmcuQ1QkU0QsMSlgKSBjb21wYXJlZCB0byBvbmx5IGByIGFubnVhbC5jYXRjaGVzLmZhbGwuQ1QkbWluYCB0byBgciBhbm51YWwuY2F0Y2hlcy5mYWxsLkNUJG1heGAgZmlzaCBkdXJpbmcgZmFsbCAobWVhbiA9IGByIGFubnVhbC5jYXRjaGVzLmZhbGwuQ1QkbWVhbmAgJFxwbSQgYHIgcm91bmQoYW5udWFsLmNhdGNoZXMuZmFsbC5DVCRTRCwxKWApLiANCg0KDQojIyMjIEFubnVhbCBDYXB0dXJlcyBGaWd1cmVzIGFuZCBUYWJsZXMNCg0KIyMjIyBGaWd1cmUgMy4gU3ByaW5nIC0gVG90YWwgYW5udWFsIGNhdGNoZXMNCmBgYHtyIDQuIEFubnVhbCBDYXB0dXJlcyAtIFNwcmluZyBTdW1tYXJ5IFBsb3QsIGZpZy5jYXAgPSAiRmlndXJlIDMuIFRvdGFsIGFubnVhbCBjYXRjaCBvZiBDQ1QgYW5kIENvaG8gU2FsbW9uIGR1cmluZyBTcHJpbmcgZmVuY2UgbW9uaXRvcmluZy4iLCBmaWcudG9wY2FwdGlvbiA9IFRSVUUsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAxMn0NCg0KcHJpbnQoY2F0Y2hfYW5udWFsX2JhclBsb3QuU3ByaW5nKQ0KYGBgDQojIyMjIFRhYmxlIDUuIFNwcmluZyAtIFRvdGFsIGFubnVhbCBjYXRjaGVzDQpgYGB7ciA0LiBBbm51YWwgQ2FwdHVyZXMgLSBTcHJpbmcgU3VtbWFyeSBUYWJsZSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KIyMgS2FibGUgLSBNYXN0ZXIgU3VtbWFyeSAtLS0tDQpvcHRpb25zKGtuaXRyLmthYmxlLk5BID0gJy0nKQ0KDQpjYXRjaF9hbm51YWwuVGFibGUuU3ByaW5nICU+JSBncm91cF9ieShZZWFyKSAlPiUgbXV0YXRlKHRvdGFsLmNhdGNoID0gbkNUICsgbkNPKQ0KDQprYWJsZShjYXRjaF9hbm51YWwuVGFibGUuU3ByaW5nICAlPiUgZ3JvdXBfYnkoWWVhcikgJT4lIG11dGF0ZSh0b3RhbC5jYXRjaCA9IG5DVCArIG5DTyksDQogICAgICAiaHRtbCIsDQogICAgICBib29rdGFicyA9IFQsDQogICAgICANCiAgICAgIGFsaWduID0gYygiYyIpLA0KICAgICAgIyBjb2wubmFtZXMgPSBjKCJZZWFyIiwgIlBlcmlvZCIsICJTdGFydCIsICJFbmQiLCAiIyBEYXlzIFNhbXBsZWQiLCANCiAgICAgIGNvbC5uYW1lcyA9IGMoIlllYXIiLCAiU3RhcnQiLCAiRW5kIiwgIiMgRGF5cyBTYW1wbGVkIiwgIA0KICAgICAgICAgICAgICAgICAgICAiTWVkLiIsIk1pbiIsIk1heCIsICJuIiwgIk1lYW4iLCAiU0QiICwiTWluIiwiTWF4IiwNCiAgICAgICAgICAgICAgICAgICAgIk1lZC4iLCJNaW4iLCJNYXgiLCAibiIsICJNZWFuIiwgIlNEIiAsIk1pbiIsIk1heCIsICJuIiksDQogICAgICBjYXB0aW9uID0gIioqVGFibGUgNS4gU3ByaW5nIGNhcHR1cmUgc3VtbWFyeSAtIGNhcHR1cmUgdGltaW5nLCB0b3RhbCBjYXB0dXJlcyBhbmQgbGVuZ3RoIG9mIENDVCBhbmQgQ29obyBTYWxtb24uKioiLA0KICAgICAgZGlnaXRzID0gMSkgJT4lDQogICNjb2x1bW5fc3BlYyhjKDEsIDMsMTAsMTcpLCBib2xkID0gVFJVRSkgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gIEZBTFNFLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gImNlbnRlciIsIA0KICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSA9IDEyLA0KICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVFJVRSkgJT4lDQogICMgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDIsICJTYW1wbGUgUGVyaW9kIiA9IDMsIA0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwgIlNhbXBsZSBQZXJpb2QiID0gMywgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAiQ2FwdHVyZSBUaW1pbmciID0gMywiRm9yayBMZW5ndGggKG1tKSIgPSA1LA0KICAgICAgICAgICAgICAgICAgICAgIkNhcHR1cmUgVGltaW5nIiA9IDMsIkZvcmsgTGVuZ3RoIChtbSkiID0gNSwiKENUK0NPKSI9MSkpICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gNCwgIkNDVCIgPSA4LCAiQ29obyBTYWxtb24iID0gOCwiVG90YWwiPTEpKSANCmBgYA0KDQojIyMjIEZpZ3VyZSA0LiBGYWxsIC0gVG90YWwgYW5udWFsIGNhdGNoZXMNCmBgYHtyIDQuIEFubnVhbCBDYXB0dXJlcyAtIEZhbGwgU3VtbWFyeSBQbG90LCBmaWcuY2FwID0gIkZpZ3VyZSA0LiBUb3RhbCBhbm51YWwgY2F0Y2ggb2YgQ0NUIGFuZCBDb2hvIFNhbG1vbiBkdXJpbmcgZmFsbCBmZW5jZSBtb25pdG9yaW5nLiIsIGZpZy50b3BjYXB0aW9uID0gVFJVRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDEyfQ0KDQpwcmludChjYXRjaF9hbm51YWxfYmFyUGxvdC5GYWxsKQ0KYGBgDQoNCiMjIyMgVGFibGUgNi4gRmFsbCAtIFRvdGFsIGFubnVhbCBjYXRjaGVzDQpgYGB7ciBBbm51YWwgQ2FwdHVyZXMgLSBGYWxsIFN1bW1hcnkgVGFibGUsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCiMjIEthYmxlIC0gTWFzdGVyIFN1bW1hcnkgLS0tLQ0Kb3B0aW9ucyhrbml0ci5rYWJsZS5OQSA9ICctJykNCg0Ka2FibGUoY2F0Y2hfYW5udWFsLlRhYmxlLkZhbGwsDQogICAgICAiaHRtbCIsDQogICAgICBib29rdGFicyA9IFQsDQogICAgICANCiAgICAgIGFsaWduID0gYygiYyIpLA0KICAgICAgIyBjb2wubmFtZXMgPSBjKCJZZWFyIiwgIlBlcmlvZCIsICJTdGFydCIsICJFbmQiLCAiIyBEYXlzIFNhbXBsZWQiLCANCiAgICAgIGNvbC5uYW1lcyA9IGMoIlllYXIiLCAiU3RhcnQiLCAiRW5kIiwgIiMgRGF5cyBTYW1wbGVkIiwgIA0KICAgICAgICAgICAgICAgICAgICAiTWVkLiIsIk1pbiIsIk1heCIsICJuIiwgIk1lYW4iLCAiU0QiICwiTWluIiwiTWF4IiwNCiAgICAgICAgICAgICAgICAgICAgIk1lZC4iLCJNaW4iLCJNYXgiLCAibiIsICJNZWFuIiwgIlNEIiAsIk1pbiIsIk1heCIpLA0KICAgICAgY2FwdGlvbiA9ICIqKlRhYmxlIDYuIEZhbGwgY2FwdHVyZSBzdW1tYXJ5IC0gY2FwdHVyZSB0aW1pbmcsIHRvdGFsIGNhcHR1cmVzIGFuZCBsZW5ndGggb2YgQ0NUIGFuZCBDb2hvIFNhbG1vbi4qKiIsDQogICAgICBkaWdpdHMgPSAxKSAlPiUNCiAgI2NvbHVtbl9zcGVjKGMoMSwgMywxMCwxNyksIGJvbGQgPSBUUlVFKSAlPiUNCiAga2FibGVfc3R5bGluZygic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSAgRkFMU0UsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSAiY2VudGVyIiwgDQogICAgICAgICAgICAgICAgZm9udF9zaXplID0gMTIsDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBUUlVFKSAlPiUNCiAgIyBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMiwgIlNhbXBsZSBQZXJpb2QiID0gMywgDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLCAiU2FtcGxlIFBlcmlvZCIgPSAzLCAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICJDYXB0dXJlIFRpbWluZyIgPSAzLCJGb3JrIExlbmd0aCAobW0pIiA9IDUsDQogICAgICAgICAgICAgICAgICAgICAiQ2FwdHVyZSBUaW1pbmciID0gMywiRm9yayBMZW5ndGggKG1tKSIgPSA1KSkgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSA0LCAiQ0NUIiA9IDgsICJDb2hvIFNhbG1vbiIgPSA4KSkgDQpgYGANCiMjIyAyLjQgTGVuZ3RoIEZyZXF1ZW5jeSB7LnRhYnNldCAudGFic2V0LWRyb3Bkb3dufQ0KYGBge3IgNi4gTGVuZ3RoIEZyZXF1ZW5jeSAtIExvYWQgRGF0YSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9DQogc291cmNlKCJTb3VyY2VGaWxlcy82LiBMZW5ndGggRnJlcXVlbmN5LlIiKQ0KYGBgDQoNCmBgYHtyIDYuIGxlbmd0aCB2YWx1ZXMsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRX0NCnNwcmluZy5kYXQgPC0gZGF0YV9hbGwgJT4lIGZpbHRlcihQZXJpb2QgPT0gIlNwcmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3RoPjIwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZXMgJWluJSBjKCJDTyIsIkNUIikpDQpDT19taW4gPC0gbWluKHNwcmluZy5kYXQkTGVuZ3RoW3NwcmluZy5kYXQkU3BlY2llcz09IkNPIl0sIG5hLnJtID0gVFJVRSkNCkNPX21heCA8LSBtYXgoc3ByaW5nLmRhdCRMZW5ndGhbc3ByaW5nLmRhdCRTcGVjaWVzPT0iQ08iXSwgbmEucm0gPSBUUlVFKQ0KDQoNCkNUX21pbiA8LSBtaW4oc3ByaW5nLmRhdCRMZW5ndGhbc3ByaW5nLmRhdCRTcGVjaWVzPT0iQ1QiXSwgbmEucm0gPSBUUlVFKQ0KQ1RfbWF4IDwtIG1heChzcHJpbmcuZGF0JExlbmd0aFtzcHJpbmcuZGF0JFNwZWNpZXM9PSJDVCJdLCBuYS5ybSA9IFRSVUUpDQoNCkFnZWQgPC0gc3ByaW5nLmRhdCAlPiUgbXV0YXRlKEFnZSA9aWZlbHNlKFNwZWNpZXMgPT0gIkNPIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShMZW5ndGggPDExMCwgMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoU3BlY2llcyA9PSAiQ1QiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKExlbmd0aCA8ODAsIDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShMZW5ndGggPDE1MCwgMSwgMikpLE5BKSkpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KFBlcmlvZCwgU3BlY2llcywgTGVuZ3RoLCBBZ2UpDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgYWdlLnRhYmxlIDwtIEFnZWQgJT4lIG11dGF0ZShBZ2UgPSBhcy5mYWN0b3IoQWdlKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KFNwZWNpZXMsIEFnZSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShuID0gbigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluID0gbWluKExlbmd0aCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggPSBtYXgoTGVuZ3RoKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZyA9IG1lYW4oTGVuZ3RoKSkNCiAgICANCkNPLkFnZTAucGVyYyA8LSBhZ2UudGFibGUkblthZ2UudGFibGUkU3BlY2llcyA9PSJDTyIgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2UudGFibGUkQWdlID09MF0vKGFnZS50YWJsZSRuW2FnZS50YWJsZSRTcGVjaWVzID09IkNPIiAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2UudGFibGUkQWdlID09MF0rIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2UudGFibGUkblthZ2UudGFibGUkU3BlY2llcyA9PSJDTyIgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZS50YWJsZSRBZ2UgPT0xXSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpgYGANCg0KDQpUaGUgbGVuZ3RoIGZyZXF1ZW5jeSBmaWd1cmVzIHNob3duIGJlbG93IHNoZWQgbGlnaHQgb24gdGhlIHBvcHVsYXRpb24gc3RydWN0dXJlIGFuZCBiZWhhdmlvdXJzIG9mIENvaG8gU2FsbW9uIGFuZCBDQ1QgaW4gU2ltbXMgQ3JlZWsuIFRoZSBsZW5ndGhzIG9mIENDVCAoYHIgQ1RfbWluYCBtbSB0byBgciBDT19tYXhgIG1tKSBhbmQgQ29obyBTYWxtb24gKGByIENPX21pbmAgbW0gdG8gYHIgQ09fbWF4YCBtbSkgbWVhc3VyZWQgYXQgdGhlIGZlbmNlIHN1Z2dlc3QgbXVsdGlwbGUgYWdlIGNsYXNzZXMgb2YganV2ZW5pbGVzIGFyZSBtb3Zpbmcgb3V0IG9mIHRoZSBzeXN0ZW0gZWFjaCBzcHJpbmcuIEFzc3VtaW5nIHRoYXQgQ08gPDEwMCBtbSBhcmUgQWdlIDAgYW5kIENPID4xMDAgbW0gYXJlIEFnZSAxIHdvdWxkIHN1Z2dlc3QgdGhhdCBgciBwZXJjZW50KHJvdW5kKENPLkFnZTAucGVyYyxkaWdpdHMgPSAzKSlgIG9mIGFsbCBvdmVyYWxsIG1pZ3JhbnRzIGFyZSBBZ2UgMCBhbmQgdGhlIHJlbWFpbmRlciBhcmUgQWdlIDEuIEEgd2lkZXIgcmFuZ2Ugb2YgYWdlIGNsYXNzZXMgaXMgbGlrZWx5IHByZXNlbnQgYW1vbmcgQ0NULCBpbmNsdWRpbmcgQWdlIDAgZmlzaCAofjw4MCBtbSkgdXAgdG8gbWF0dXJlIGZpc2ggPiAyMzAgbW0gYW5kIHVwd2FyZHMgb2YgMysgeWVhcnMuIA0KDQpNYXR1cmUgQ0NUID4yMzAgbW0gcmVwcmVzZW50IDxgciBwZXJjZW50KHJvdW5kKENULkFnZUNsYXNzLlByb3AkQWR1bHQsIGRpZ2l0cyA9MykpYCBvZiB0aGUgdG90YWwgY2F0Y2ggb2YgQ0NULiBIb3dldmVyLCBhbGwgbWF0dXJlIENDVCA+MjMwIG1tIHdlcmUgbW92aW5nIGRvd25zdHJlYW0sIHN1Z2dlc3RpbmcgdGhhdCB0aGV5IGVpdGhlciAxKSBtb3ZlZCB1cHN0cmVhbSBhbmQgc3Bhd25lZCBwcmlvciB0byB0aGUgc3RhcnQgb2YgZmVuY2Ugb3BlcmF0aW9uIG9yIDIpIGhhZCBvdmVyd2ludGVyZWQgaW4gU2ltbXMgQ3JlZWsgYW5kIHdlcmUgZm9sbG93IGZyeSBvdXQgaW4gdGhlIHNwcmluZyAtIHdoZXRoZXIgdGhpcyB3YXMgdGhlaXIgZmlyc3QgbW92ZW1lbnQgdG8gdGhlIG9jZWFuIGlzIHVua25vd24uIA0KDQojIyMjIExlbmd0aCBGcmVxdWVuY3kgVGFibGUgYW5kIEZpZ3VyZXMNCg0KIyMjIyBGaWd1cmUgNS4gTGVuZ3RoIEZyZXF1ZW5jeSBvZiBhbGwgQ0NUDQpgYGB7ciA2LiBMZW5ndGggRnJlcXVlbmN5IC0gQ1QgTGVuZ3RoIEZyZXF1ZW5jeSBBbGwgWWVhcnMgQ29tYmluZWQsIGZpZy5jYXAgPSAiRmlndXJlIDUuIExlbmd0aCBGcmVxdWVuY3kgb2YgYWxsIENDVC4iLCBmaWcudG9wY2FwdGlvbiA9IFRSVUUsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDZ9DQoNCnByaW50KExGLnBsb3Rfc3ByaW5nLmFsbC5DVCkNCmBgYA0KDQoNCiMjIyMgRmlndXJlIDYuIExlbmd0aCBmcmVxdWVuY3kgb2YgQ29hc3RhbCBDQ1QgYWNyb3NzIHllYXJzLg0KYGBge3IgNi4gTGVuZ3RoIEZyZXF1ZW5jeSAtIENUIExlbmd0aCBGcmVxdWVuY3kgQWNyb3NzIFllYXJzLCBmaWcuY2FwID0gIkZpZ3VyZSA2LiBMZW5ndGggRnJlcXVlbmN5IG9mIENDVCBhY3Jvc3MgeWVhcnMuIiwgZmlnLnRvcGNhcHRpb24gPSBUUlVFLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMjB9DQoNCnByaW50KExGLnBsb3Rfc3ByaW5nLkNUKQ0KYGBgDQoNCiMjIyMgRmlndXJlIDcuIExlbmd0aCBmcmVxdWVuY3kgb2YgYWxsIENvaG8gU2FsbW9uLg0KYGBge3IgNi4gTGVuZ3RoIEZyZXF1ZW5jeSAtIENPIExlbmd0aCBGcmVxdWVuY3kgQWxsIFllYXJzIENvbWJpbmVkLCBmaWcuY2FwID0gIkZpZ3VyZSA3LiBMZW5ndGggRnJlcXVlbmN5IG9mIEFsbCBDb2hvIFNhbG1vbi4iLCBmaWcudG9wY2FwdGlvbiA9IFRSVUUsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDZ9DQoNCnByaW50KExGLnBsb3Rfc3ByaW5nLmFsbC5DTykNCmBgYA0KDQojIyMjIEZpZ3VyZSA4LiBMZW5ndGggZnJlcXVlbmN5IG9mIENvaG8gU2FsbW9uIGFjcm9zcyB5ZWFycy4NCmBgYHtyIDYuIExlbmd0aCBGcmVxdWVuY3kgLSBDTyBMZW5ndGggRnJlcXVlbmN5IEFjcm9zcyBZZWFycywgZmlnLmNhcCA9ICJGaWd1cmUgOC4gTGVuZ3RoIEZyZXF1ZW5jeSBvZiBDb2hvIFNhbG1vbiBhY3Jvc3MgeWVhcnMuIiwgZmlnLnRvcGNhcHRpb24gPSBUUlVFLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gMjB9DQoNCnByaW50KExGLnBsb3Rfc3ByaW5nLkNPKQ0KYGBgDQoNCiMjIyAyLjUgQWdlIENvbXBvc2l0aW9uDQpgYGB7ciAxMC4gQWdlQ2xhc3NlcyAtIExvYWQgRGF0YSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9DQpzb3VyY2UoIlNvdXJjZUZpbGVzLzEwLiBBZ2VDbGFzc2VzLlIiKQ0KYGBgDQoNCk5vIHNjYWxlIGRhdGEgaGFzIGJlZW4gY29sbGVjdGVkIGR1cmluZyBqdXZlbmlsZSBlbnVtZXJhdGlvbiB3b3JrIG9uIFNpbW1zIENyZWVrLiBIb3dldmVyLCBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgb24gc3lzdGVtcyB3aXRoaW4gdGhlIHJlZ2lvbiBzdWdnZXN0cyB3ZSBjYW4gbG9vc2VseSBhcHBseSB0aGUgZm9sbG93aW5nIGFnZSBjbGFzc2VzIHRvIGp1dmVuaWxlIENUIGFuZCBDTzoNCg0KICAtICBDVCA8IDgwICB+IEFnZS0wIA0KICAtICBDVCA8IDEyMCB+IEFnZS0xDQogIC0gIENUIDwgMjAwIH4gQWdlLTINCiAgLSAgQ1QgPiAyMDAgfiBBZ2UtMisNCiAgLSAgQ08gPCA4MCAgfiBBZ2UtMA0KICAtICBDTyA8IDEyMCB+IEFnZS0xDQogIC0gIENPID4gMTIwIH4gQWdlLTErIA0KDQpBcHBseWluZyB0aGVzZSBhZ2UgYmlucyB0byB0aGUgbGVuZ3RoIGZyZXF1ZW5jeSBkYXRhIHN1Z2dlc3RzIHRoYXQgQ0NUIGFyZSByYW5nZSBpbiBhZ2UgZnJvbSBBZ2UtMSB0byBBZ2UgMyssIGJ1dCBhcmUgcHJpbWFyaWx5IEFnZS0yIChGaWd1cmUgOSksIHdoaWxlIENPIGFyZSBhbG1vc3QgZXhjbHVzaXZlbHkgQWdlLTEgKEZpZ3VyZSAxMCkuIEludGVyZXN0aW5nbHksIEFnZS0wIENPIHdlcmUgcHJlc2VudCBpbiAyMDA5IGFuZCAyMDI0LCBidXQgbm90IG90aGVyIHllYXJzLiBXaGlsZSB0aGlzIG1heSBiZSBjb2luY2lkZW50YWwsIGl0J3Mgd29ydGggbm90aW5nIHRoYXQgdGhlIHBlYWsganV2ZW5pbGUgQ0NUIGNvdW50cyB3ZXJlIHJlY29yZGVkIGluIDIwMDggYW5kIDIwMjQuIFRoZXJlIGFyZSBhIG51bWJlciBvZiBtZWNoYW5pc21zIHRoYXQgbWF5IGV4cGxhaW4gd2h5IEFnZS0wIENPIHdlcmUgZmlyc3Qgb2JzZXJ2ZWQgaW4gMjAyNDogMSkgdGhleSB3ZXJlbid0IHJlY29yZGVkIGluIHBhc3QgeWVhcnMsIENPIGVtaWdyYXRlZCBvdXQgb2YgU2ltbXMgQ3JlZWsgZWFybGllciB0aGFuIG5vcm1hbCBkdWUgdG8gaGlnaCBDVCBhYnVuZGFuY2UuDQoNCiMjIyMgRmlndXJlIDkuIEFnZSBjb21wb3NpdGlvbiBhY3Jvc3MgeWVhcnMuDQpgYGB7ciAxMC4gQWdlIENsYXNzIC0gQ1QgQWdlIENsYXNzIENvbXBvc2l0aW9uIGFjcm9zcyB5ZWFycywgZmlnLmNhcCA9ICJGaWd1cmUgOS4gQXNzdW1lZCBhZ2UgY2xhc3MgY29tcG9zaXRpb24gb2YganV2ZW5pbGUgQ0NUIGFuZCBDb2hvIFNhbG1vbiBvdXQgbWlncmF0aW5nIGZyb20gU2ltbXMgQ3JlZWsgc2luY2UgMjAwOC4iLCBmaWcudG9wY2FwdGlvbiA9IFRSVUUsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLndpZHRoID0gMTIsIGZpZy5oZWlnaHQgPSAyMH0NCg0KanV2LkFnZUNsYXNzLnBsb3QNCg0KYGBgDQoNCg0KIyMjIyBGaWd1cmUgMTAuIFNpemUgYnkgYWdlIGNsYXNzIGFjcm9zcyB5ZWFycy4NCmBgYHtyIDEwLiBBZ2UgQ2xhc3MgLSBBZ2UgQ2xhc3MgU2l6ZSBhY3Jvc3MgeWVhcnMsIGZpZy5jYXAgPSAiRmlndXJlIDEwLiBNZWRpYW4gc2l6ZSBieSBhZ2UgY2xhc3Mgb2YgZmlzaCBvdXRtaWdyYXRpbmcgZnJvbSBTaW1tcyBDcmVlayBzaW5jZSAyMDA4LiIsIGZpZy50b3BjYXB0aW9uID0gVFJVRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDIwfQ0KDQphZ2UuY2xhc3Muc2l6ZQ0KDQpgYGANCg0KIyMjIDIuNi4gTWlncmF0aW9uIFRpbWluZyB7LnRhYnNldCAudGFic2V0LWRyb3Bkb3dufQ0KYGBge3IgNS4gQ2FwdHVyZSBUaW1pbmcgLSBMb2FkIERhdGEsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgaW5jbHVkZSA9IEZBTFNFfQ0KIHNvdXJjZSgiU291cmNlRmlsZXMvNS4gQ2FwdHVyZSBUaW1pbmcuUiIpDQpgYGANCg0KYGBge3IgNS4gQ2FwdHVyZSBUaW1pbmcgLSBQcmVwYXJlIHNwcmluZyB0ZXh0IHZhbHVlcywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0UgfQ0KDQojIyBTcHJpbmcgZGF0YSBmb3IgdGV4dA0KQ1QuZmlyc3QuZGV0ZWN0aW9uLmVhcmxpZXN0IDwtIGZvcm1hdChtaW4ocGFzcy5wZXJpb2Quc3ByaW5nJG1pblBhc3MubWluW3Bhc3MucGVyaW9kLnNwcmluZyRTcGVjaWVzPT0iQ1QiXSksICIlQiAlZCIpDQpDVC5maXJzdC5kZXRlY3Rpb24ubGF0ZXN0ICAgPC0gZm9ybWF0KG1heChwYXNzLnBlcmlvZC5zcHJpbmckbWluUGFzcy5taW5bcGFzcy5wZXJpb2Quc3ByaW5nJFNwZWNpZXM9PSJDVCJdKSwgIiVCICVkIikNCkNULmZpcnN0LmRldGVjdGlvbi5tZWFuICAgICA8LSBmb3JtYXQobWVhbihwYXNzLnBlcmlvZC5zcHJpbmckbWluUGFzcy5taW5bcGFzcy5wZXJpb2Quc3ByaW5nJFNwZWNpZXM9PSJDVCJdLCBuYS5ybSA9IFRSVUUpLCAiJUIgJWQiKQ0KQ1QuZmlyc3QuZGV0ZWN0aW9uLlNEICAgICAgIDwtIHJvdW5kKHNkKHBhc3MucGVyaW9kLnNwcmluZyRtaW5NZWFuRGlmZltwYXNzLnBlcmlvZC5zcHJpbmckU3BlY2llcz09IkNUIl0sIG5hLnJtID0gVFJVRSksIDEpDQpDVC41MHAubWVhbiAgICAgICAgICAgICAgICAgPC0gZm9ybWF0KG1lYW4oY2F0Y2g1MHByb3Auc3ByaW5nJG1lYW5EYXRlNTBwW2NhdGNoNTBwcm9wLnNwcmluZyRTcGVjaWVzPT0iQ1QiXSwgbmEucm0gPSBUUlVFKSwgIiVCICVkIikNCkNULjUwcC5TRCAgICAgICAgICAgICAgICAgICA8LSByb3VuZChzZChjYXRjaDUwcHJvcC5zcHJpbmckRGF0ZTUwcERpZmZbY2F0Y2g1MHByb3Auc3ByaW5nJFNwZWNpZXM9PSJDVCJdLCBuYS5ybSA9IFRSVUUpLCAxKQ0KQ1QucGVhay5tZWFuICAgICAgICAgICAgICAgIDwtIGZvcm1hdChtZWFuKGNhdGNoX3BlYWsuc3ByaW5nJGRhdGUuc3RkX0NULG5hLnJtID0gVFJVRSksICIlQiAlZCIpDQpDVC5wZWFrLlNEICAgICAgICAgICAgICAgICAgPC0gcm91bmQoc2QoY2F0Y2hfcGVhay5zcHJpbmckTWVhbkRpZmZfQ1QsbmEucm0gPSBUUlVFKSwxKQ0KDQoNCkNPLmZpcnN0LmRldGVjdGlvbi5lYXJsaWVzdCA8LSBmb3JtYXQobWluKHBhc3MucGVyaW9kLnNwcmluZyRtaW5QYXNzLm1pbltwYXNzLnBlcmlvZC5zcHJpbmckU3BlY2llcz09IkNPIl0pLCAiJUIgJWQiKQ0KQ08uZmlyc3QuZGV0ZWN0aW9uLmxhdGVzdCAgIDwtIGZvcm1hdChtYXgocGFzcy5wZXJpb2Quc3ByaW5nJG1pblBhc3MubWluW3Bhc3MucGVyaW9kLnNwcmluZyRTcGVjaWVzPT0iQ08iXSksICIlQiAlZCIpDQpDTy5maXJzdC5kZXRlY3Rpb24ubWVhbiAgICAgPC0gZm9ybWF0KG1lYW4ocGFzcy5wZXJpb2Quc3ByaW5nJG1pblBhc3MubWluW3Bhc3MucGVyaW9kLnNwcmluZyRTcGVjaWVzPT0iQ08iXSwgbmEucm0gPSBUUlVFKSwgIiVCICVkIikNCkNPLmZpcnN0LmRldGVjdGlvbi5TRCAgICAgICA8LSByb3VuZChzZChwYXNzLnBlcmlvZC5zcHJpbmckbWluTWVhbkRpZmZbcGFzcy5wZXJpb2Quc3ByaW5nJFNwZWNpZXM9PSJDTyJdLCBuYS5ybSA9IFRSVUUpLCAxKQ0KQ08uNTBwLm1lYW4gICAgICAgICAgICAgICAgIDwtIGZvcm1hdChtZWFuKGNhdGNoNTBwcm9wLnNwcmluZyRtZWFuRGF0ZTUwcFtjYXRjaDUwcHJvcC5zcHJpbmckU3BlY2llcz09IkNPIl0sIG5hLnJtID0gVFJVRSksICIlQiAlZCIpDQpDTy41MHAuU0QgICAgICAgICAgICAgICAgICAgPC0gcm91bmQoc2QoY2F0Y2g1MHByb3Auc3ByaW5nJERhdGU1MHBEaWZmW2NhdGNoNTBwcm9wLnNwcmluZyRTcGVjaWVzPT0iQ08iXSwgbmEucm0gPSBUUlVFKSwgMSkNCkNPLnBlYWsubWVhbiAgICAgICAgICAgICAgICA8LSBmb3JtYXQobWVhbihjYXRjaF9wZWFrLnNwcmluZyRkYXRlLnN0ZF9DTyxuYS5ybSA9IFRSVUUpLCAiJUIgJWQiKQ0KQ08ucGVhay5TRCAgICAgICAgICAgICAgICAgIDwtIHJvdW5kKHNkKGNhdGNoX3BlYWsuc3ByaW5nJE1lYW5EaWZmX0NPLG5hLnJtID0gVFJVRSksMSkNCg0KYGBgDQoNCioqMi40LjEgU3ByaW5nIE91dG1pZ3JhdGlvbioqDQoNCk91dG1pZ3JhdGluZyBqdXZlbmlsZSBDQ1QgYW5kIENvaG8gU2FsbW9uIHdlcmUgZmlyc3QgZW5jb3VudGVyZWQgYXQgdGhlIHRyYXAgb3ZlciBhIHNpbWlsYXIgcGVyaW9kLCBmcm9tIGByIENULmZpcnN0LmRldGVjdGlvbi5lYXJsaWVzdGAgdG8gYHIgQ1QuZmlyc3QuZGV0ZWN0aW9uLmxhdGVzdGAgKG1lYW4gJFxwbSQgU0QgPSBgciBDVC5maXJzdC5kZXRlY3Rpb24ubWVhbmAgJFxwbSQgYHIgQ1QuZmlyc3QuZGV0ZWN0aW9uLlNEYCBkYXlzKSBmb3IgQ0NUIGFuZCBgciBDTy5maXJzdC5kZXRlY3Rpb24uZWFybGllc3RgIHRvIGByIENPLmZpcnN0LmRldGVjdGlvbi5sYXRlc3RgIGZvciBDb2hvIChtZWFuICRccG0kIFNEID0gYHIgQ08uZmlyc3QuZGV0ZWN0aW9uLm1lYW5gICRccG0kIGByIENPLmZpcnN0LmRldGVjdGlvbi5TRGAgZGF5cykuIE9uIGF2ZXJhZ2UgNTAlIG9mIGFsbCBDQ1QgaGFkIHBhc3NlZCB0aGUgZmVuY2UgYnkgYHIgQ1QuNTBwLm1lYW5gJFxwbSQgYHIgQ1QuNTBwLlNEYCBkYXlzIHdoaWxlIGhhbGYgb2YgQ29obyBTYWxtb24gbWlncmFudHMgaGFkIHBhc3NlZCB0aGUgZmVuY2UgYnkgYHIgQ08uNTBwLm1lYW5gJFxwbSQgYHIgQ08uNTBwLlNEYCBkYXlzLiBEZXNwaXRlIHNpbWlsYXJpdGllcyBpbiB3aGVuIG1pZ3JhdGlvbnMgc3RhcnRlZCBhbmQgdGhlIHRpbWluZyB0aGF0IG1vc3QgbWlncmFudHMgaGFkIHBhc3QgdGhlIGZlbmNlLCB0aGVyZSB3YXMgYSBub3RpY2VhYmxlIGRpZmZlcmVuY2UgaW4gdGhlIHRpbWluZyBvZiBwZWFrIG1pZ3JhdGlvbnMgKHRoZSBkYXRlIHdoZW4gdGhlIGdyZWF0ZXN0IG51bWJlciBvZiBmaXNoIHBhc3NlZCB0aGUgZmVuY2UpLiBGb3IgQ29hc3RhbCBDQ1QsIHRoZSBvdmVyYWxsIG1lYW4gJFxwbSQgU0QgcGVhayBtaWdyYXRpb24gb2NjdXJyZWQgb24gYHIgQ1QucGVhay5tZWFuYCgkXHBtJCBgciBDVC5wZWFrLlNEYCBkYXlzKSAoRmlndXJlIDUpIHdoZXJlYXMgb3ZlcmFsbCBtZWFuIHBlYWsgQ29obyBTYWxtb24gbWlncmF0aW9uIG9jY3VycmVkIG1vcmUgdGhhbiBhIHdlZWsgbGF0ZXIgb24gYHIgQ08ucGVhay5tZWFuYCAoJFxwbSQgYHIgQ08ucGVhay5TRGAgZGF5cykgKEZpZ3VyZSA2KS4gVG90YWwgbnVtYmVyIG9mIGRhaWx5IGNhcHR1cmVzIG9mIENDVCBhbmQgQ29obyBTYWxtb24gcGVyIHllYXIgYXJlIHByZXNlbnRlZCBpbiBGaWd1cmUgNiBhbmQgRmlndXJlIDcsIHJlc3BlY3RpdmVseS4gDQoNCmBgYHtyIDUuIENhcHR1cmUgVGltaW5nIC0gUHJlcGFyZSBmYWxsIHRleHQgdmFsdWVzLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRSB9DQojIyBGYWxsIGRhdGEgZm9yIHRleHQNCkNULmZpcnN0LmRldGVjdGlvbi5lYXJsaWVzdCA8LSBmb3JtYXQobWluKHBhc3MucGVyaW9kLmZhbGwkbWluUGFzcy5taW5bcGFzcy5wZXJpb2QuZmFsbCRTcGVjaWVzPT0iQ1QiXSksICIlQiAlZCIpDQpDVC5maXJzdC5kZXRlY3Rpb24ubGF0ZXN0ICAgPC0gZm9ybWF0KG1heChwYXNzLnBlcmlvZC5mYWxsJG1pblBhc3MubWluW3Bhc3MucGVyaW9kLmZhbGwkU3BlY2llcz09IkNUIl0pLCAiJUIgJWQiKQ0KQ1QuZmlyc3QuZGV0ZWN0aW9uLm1lYW4gICAgIDwtIGZvcm1hdChtZWFuKHBhc3MucGVyaW9kLmZhbGwkbWluUGFzcy5taW5bcGFzcy5wZXJpb2QuZmFsbCRTcGVjaWVzPT0iQ1QiXSwgbmEucm0gPSBUUlVFKSwgIiVCICVkIikNCkNULmZpcnN0LmRldGVjdGlvbi5TRCAgICAgICA8LSByb3VuZChzZChwYXNzLnBlcmlvZC5mYWxsJG1pbk1lYW5EaWZmW3Bhc3MucGVyaW9kLmZhbGwkU3BlY2llcz09IkNUIl0sIG5hLnJtID0gVFJVRSksIDEpDQpDVC41MHAubWVhbiAgICAgICAgICAgICAgICAgPC0gZm9ybWF0KG1lYW4oY2F0Y2g1MHByb3AuZmFsbCRtZWFuRGF0ZTUwcFtjYXRjaDUwcHJvcC5mYWxsJFNwZWNpZXM9PSJDVCJdLCBuYS5ybSA9IFRSVUUpLCAiJUIgJWQiKQ0KQ1QuNTBwLlNEICAgICAgICAgICAgICAgICAgIDwtIHJvdW5kKHNkKGNhdGNoNTBwcm9wLmZhbGwkRGF0ZTUwcERpZmZbY2F0Y2g1MHByb3AuZmFsbCRTcGVjaWVzPT0iQ1QiXSwgbmEucm0gPSBUUlVFKSwgMSkNCkNULnBlYWsubWVhbiAgICAgICAgICAgICAgICA8LSBmb3JtYXQobWVhbihjYXRjaF9wZWFrLmZhbGwkZGF0ZS5zdGRfQ1QsbmEucm0gPSBUUlVFKSwgIiVCICVkIikNCkNULnBlYWsuU0QgICAgICAgICAgICAgICAgICA8LSByb3VuZChzZChjYXRjaF9wZWFrLmZhbGwkTWVhbkRpZmZfQ1QsbmEucm0gPSBUUlVFKSwxKQ0KDQoNCkNPLmZpcnN0LmRldGVjdGlvbi5lYXJsaWVzdCA8LSBmb3JtYXQobWluKHBhc3MucGVyaW9kLmZhbGwkbWluUGFzcy5taW5bcGFzcy5wZXJpb2QuZmFsbCRTcGVjaWVzPT0iQ08iXSksICIlQiAlZCIpDQpDTy5maXJzdC5kZXRlY3Rpb24ubGF0ZXN0ICAgPC0gZm9ybWF0KG1heChwYXNzLnBlcmlvZC5mYWxsJG1pblBhc3MubWluW3Bhc3MucGVyaW9kLmZhbGwkU3BlY2llcz09IkNPIl0pLCAiJUIgJWQiKQ0KQ08uZmlyc3QuZGV0ZWN0aW9uLm1lYW4gICAgIDwtIGZvcm1hdChtZWFuKHBhc3MucGVyaW9kLmZhbGwkbWluUGFzcy5taW5bcGFzcy5wZXJpb2QuZmFsbCRTcGVjaWVzPT0iQ08iXSwgbmEucm0gPSBUUlVFKSwgIiVCICVkIikNCkNPLmZpcnN0LmRldGVjdGlvbi5TRCAgICAgICA8LSByb3VuZChzZChwYXNzLnBlcmlvZC5mYWxsJG1pbk1lYW5EaWZmW3Bhc3MucGVyaW9kLmZhbGwkU3BlY2llcz09IkNPIl0sIG5hLnJtID0gVFJVRSksIDEpDQpDTy41MHAubWVhbiAgICAgICAgICAgICAgICAgPC0gZm9ybWF0KG1lYW4oY2F0Y2g1MHByb3AuZmFsbCRtZWFuRGF0ZTUwcFtjYXRjaDUwcHJvcC5mYWxsJFNwZWNpZXM9PSJDTyJdLCBuYS5ybSA9IFRSVUUpLCAiJUIgJWQiKQ0KQ08uNTBwLlNEICAgICAgICAgICAgICAgICAgIDwtIHJvdW5kKHNkKGNhdGNoNTBwcm9wLmZhbGwkRGF0ZTUwcERpZmZbY2F0Y2g1MHByb3AuZmFsbCRTcGVjaWVzPT0iQ08iXSwgbmEucm0gPSBUUlVFKSwgMSkNCkNPLnBlYWsubWVhbiAgICAgICAgICAgICAgICA8LSBmb3JtYXQobWVhbihjYXRjaF9wZWFrLmZhbGwkZGF0ZS5zdGRfQ08sbmEucm0gPSBUUlVFKSwgIiVCICVkIikNCkNPLnBlYWsuU0QgICAgICAgICAgICAgICAgICA8LSByb3VuZChzZChjYXRjaF9wZWFrLmZhbGwkTWVhbkRpZmZfQ08sbmEucm0gPSBUUlVFKSwxKQ0KDQpgYGANCg0KKioyLjQuMiBGYWxsIFJldHVybiBUaW1pbmcqKg0KDQpBZHVsdCBDb2hvIFNhbG1vbiBoYXZlIGJlZW4gZGV0ZWN0ZWQgYXQgdGhlIGZlbmNlIGFzIGVhcmx5IGFzIGByIENPLmZpcnN0LmRldGVjdGlvbi5lYXJsaWVzdGAgYW5kIGFzIGxhdGUgYXMgYHIgQ08uZmlyc3QuZGV0ZWN0aW9uLmxhdGVzdGAsIHRob3VnaCBtb3N0IG9mIHRoZSBydW4gKDUwJSkgYXJyaXZlIHdpdGhpbiBhIHdlZWsgb2YgYHIgQ08uNTBwLm1lYW5gIChGaWd1cmUgMTQgdG8gMTkpLiBSZWxhdGl2ZSB0byBzcHJpbmcgc2FtcGxpbmcsIENDVCBhcmUgZW5jb3VudGVyZWQgbGVzcyBmcmVxdWVudGx5IGluIHRoZSBmYWxsIGFuZCAgYXJyaXZhbCB0aW1pbmcgYXBwZWFycyB0byBiZSBjb25zaWRlcmFibHkgbW9yZSB2YXJpYWJsZSAoRmlndXJlIDIwIHRvIDIyKS4gICAgIA0KDQoNCiMjIyMgU3ByaW5nIGFuZCBGYWxsIE1pZ3JhdGlvbiBUaW1pbmcgVGFibGVzIGFuZCBGaWd1cmVzDQoNCiMjIyMgRmlndXJlIDExLiBTcHJpbmcgLSBPdmVyYWxsIENhcHR1cmUgVGltaW5nDQpgYGB7ciA1LiBDYXB0dXJlIFRpbWluZyAtIFNwcmluZyAtIE92ZXJhbGwgTWVkaWFuIENhcHR1cmUgVGltaW5nLCBmaWcuY2FwID0gIkZpZ3VyZSAxMS4gT3ZlcmFsbCBtZWRpYW4gc3ByaW5nIGNhcHR1cmUgdGltaW5nLiIsIGZpZy50b3BjYXB0aW9uID0gVFJVRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDZ9DQpTcHJpbmcuQm94cGxvdC5GYWNldA0KYGBgDQoNCg0KIyMjIyBGaWd1cmUgMTIuIFNwcmluZyAtIERhaWx5IGNhcHR1cmVzIG9mIENDVCBwZXIgeWVhcg0KYGBge3IgNS4gQ2FwdHVyZSBUaW1pbmcgLSBTcHJpbmcgLSBEYWlseSBDVCBDYXB0dXJlcyBwZXIgeWVhciwgZmlnLmNhcCA9ICJGaWd1cmUgMTIuIFRvdGFsIGRhaWx5IGNhcHR1cmUgb2YgQ0NUIGFuZCBwcm9wb3J0aW9uIG9mIHRvdGFsIGFubnVhbCBjYXB0dXJlcy4iLCBmaWcudG9wY2FwdGlvbiA9IFRSVUUsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAyNX0NCg0KcHJpbnQoZGFpbHlfY2F0Y2hfcGxvdC5TcHJpbmcuQ1QpDQpgYGANCg0KIyMjIyBGaWd1cmUgMTMuIFNwcmluZyAtIFRvdGFsIGRhaWx5IGNhcHR1cmVzIG9mIENvaG8gU2FsbW9uIHBlciB5ZWFyDQpgYGB7ciA1LiBDYXB0dXJlIFRpbWluZyAtIFNwcmluZyAtIERhaWx5IENPIENhcHR1cmVzIHBlciB5ZWFyLCBmaWcuY2FwID0gIkZpZ3VyZSAxMy4gTnVtYmVyIG9mIENvaG8gU2FsbW9uIGNhcHR1cmVkIGR1cmluZyBlYWNoIGRheSBvZiBzcHJpbmcgZmVuY2Ugb3BlcmF0aW9uIHNpbmNlIDIwMDguIiwgZmlnLnRvcGNhcHRpb24gPSBUUlVFLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gMjV9DQoNCnByaW50KGRhaWx5X2NhdGNoX3Bsb3QuU3ByaW5nLkNPKQ0KYGBgDQoNCiMjIyMgRmlndXJlIDE0LiBGYWxsIC0gVG90YWwgZGFpbHkgY2FwdHVyZXMgb2YgQ29obyBTYWxtb24gcGVyIHllYXINCmBgYHtyIDUuIENhcHR1cmUgVGltaW5nIC0gRmFsbCAtIERhaWx5IENPIENhcHR1cmVzIHBlciB5ZWFyLCBmaWcuY2FwID0gIkZpZ3VyZSAxNC4gTnVtYmVyIG9mIENvaG8gU2FsbW9uIGNhcHR1cmVkIGR1cmluZyBlYWNoIGRheSBvZiBmYWxsIGZlbmNlIG9wZXJhdGlvbiBzaW5jZSAyMDA4LiIsIGZpZy50b3BjYXB0aW9uID0gVFJVRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDI1fQ0KDQpwcmludChkYWlseV9jYXRjaF9wbG90LkZhbGwuQ08pDQpgYGANCg0KIyMjIyBGaWd1cmUgMTUuIEZhbGwgLSBEYWlseSBjYXB0dXJlcyBvZiBDQ1QgcGVyIHllYXINCmBgYHtyIDUuIENhcHR1cmUgVGltaW5nIC0gRmFsbCAtIERhaWx5IENUIENhcHR1cmVzIHBlciB5ZWFyLCBmaWcuY2FwID0gIkZpZ3VyZSAxNS4gVG90YWwgZGFpbHkgY2FwdHVyZSBvZiBDQ1QgYW5kIHByb3BvcnRpb24gb2YgdG90YWwgYW5udWFsIGNhcHR1cmVzLiIsIGZpZy50b3BjYXB0aW9uID0gVFJVRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDI1fQ0KDQpwcmludChkYWlseV9jYXRjaF9wbG90LkZhbGwuQ1QpDQpgYGANCg0KDQoNCg0KIyMgMi42IFdoYXQgYXJlIHRoZXNlIGZpc2ggZG9pbmc/Pz8NCmBgYHtyIDguIFNwcmluZyBTcGF3bmVycyAtIExvYWQgRGF0YSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9DQogc291cmNlKCJTb3VyY2VGaWxlcy84LiBTcHJpbmdTcGF3bmVycy5SIikNCmBgYA0KDQpDQ1Qgc2hvdyBpbmNyZWRpYmxlIGRpdmVyc2l0eSBpbiB0aGUgdGltaW5nIG9mIHRoZWlyIGxpZmUgaGlzdG9yeSBiZWhhdmlvdXJzLiBUaHJvdWdob3V0IHRoZWlyIHJhbmdlLCBzcGF3bmluZyBoYXMgYmVlbiBkb2N1bWVudGVkIGluIG5lYXJseSBldmVyeSBtb250aCBvZiB0aGUgeWVhci4gSW4gUHVnZXQgU291bmQgZm9yIGluc3RhbmNlLCBzcGF3bmluZyBoYXMgYmVlbiByZXBvcnRlZCBmcm9tIE5vdmVtYmVyIHRocm91Z2ggTWFyY2ggYW5kIHRpbWluZyBpcyBoaWdobHkgdmFyaWFibGUgYmV0d2VlbiB5ZWFycyAoW0xvc2VlIGV0IGFsLiAyMDE2XShodHRwczovL2Fmc3B1YnMub25saW5lbGlicmFyeS53aWxleS5jb20vZG9pL2Ficy8xMC4xMDgwLzAyNzU1OTQ3LjIwMTUuMTEyOTAwMSM6fjp0ZXh0PVRoZXNlJTIwdHlwZXMlMjBvZiUyMGRhdGElMjBoYXZlJTIwc3VnZ2VzdGVkJTIwYSxjb2FzdGFsJTIwc3RyZWFtJTIwb2YlMjBzb3V0aGVybiUyMFB1Z2V0JTIwU291bmQlMkMlMjBXYXNoaW5ndG9uLikpLiBUaGUgc3Bhd24gdGltaW5nIG9mIENDVCBpbiBTaW1tcyBDcmVlayBpcyB1bmtub3duLCBvciBhdCBsZWFzdCB1bmRvY3VtZW50ZWQsIGhvd2V2ZXIsIEkgd291bGQgYXNzdW1lIGl0IG9jY3VycyBkdXJpbmcgYSBzaW1pbGFyIHBlcmlvZCB0byBQdWdldCBTb3VuZCBhbmQgaXMgZXF1YWxseSB2YXJpYWJsZS4gDQoNClRoZSBjdXJyZW50IGRhdGFzZXQgZG9lcyBwcm92aWRlIHNvbWUgaW5zaWdodCBvbiBzcGF3biB0aW1pbmcuIFByZXN1bWFibHksIHNwYXduZXJzIHdpbGwgYmUgPjE1MCBtbSBpbiBsZW5ndGguDQoNCiMgRklOSVNIIFdSSVRJTkcgVEhJUyBTRUNUSU9ODQoNCg0KIyMgMy4gU3Vydml2YWwNCiMjIyAzLjEgV2hhdCBtYXkgYmUgZHJpdmluZyBqdXZlbmlsZSBhYnVuZGFuY2UNCmBgYHsgOS4gU3Vydml2YWwsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRX0NCnNvdXJjZSgiU291cmNlRmlsZXMvOS4gU3Vydml2YWwuUiIpDQpgYGANCg0KVG8gZXN0aW1hdGUgdGhlIG51bWJlciBvZiBDb2hvIFNhbG1vbiB0aGF0IHN1cnZpdmUgZnJvbSBlZ2cgdG8gZnJ5LCB3ZSBuZWVkIHRvIG1ha2UgYSBudW1iZXIgb2YgYXNzdW1wdGlvbnM6DQoNCiAgICAtIEFsbCBhZHVsdCBDb2hvIFNhbG1vbiB0aGF0IGVudGVyIFNpbW1zIENyZWVrIGFuZCBhbGwganV2ZW5pbGUgQ29obyBTYWxtb24gdGhhdCBvdXRtaWdyYXRlIGZyb20gU2ltbXMgQ3JlZWsgYXJlIGVudW1lcmF0ZWQuICANCiAgICAtIEFsbCBhZHVsdCBDb2hvIFNhbG1vbiB0aGF0IHBhc3MgdGhlIGZlbmNlIHdpbGwgc3VjY2Vzc2Z1bGx5IHNwYXduLg0KICAgIC0gVGhlIHNleCByYXRpbyBvZiBhZHVsdHMgaXMgZXF1YWwgKDUwJSBhcmUgZmVtYWxlLCBleGNsdWRpbmcgamFja3Mgd2hpY2ggYXJlIGFzc3VtZWQgbWFsZSkuDQogICAgLSBFYWNoIGZlbWFsZSB3aWxsIGRlcG9zaXQgfjIsNjAwIGVnZ3MuDQoNCkltcG9ydGFudGx5LCB3ZSBhbHNvIG5lZWQgdG8gY29uc2lkZXIgdGhlIHByb3BvcnRpb24gb2YganV2ZW5pbGVzIGZyb20gZWFjaCBhZ2UtY2xhc3MgdGhlIGVtaWdyYXRlIGVhY2ggeWVhciAoYW5kIGFzc3VtZSBqdXZlbmlsZSBhZ2UgYXNzaWdubWVudHMgYXJlIGFjY3VyYXRlKS4gRmlzaCB0aGF0IG91dG1pZ3JhdGUgYXMgQWdlLTAgZnJ5IHdpbGwgYmUgcHJvZ2VueSBvZiBmaXNoIHRoYXQgc3Bhd25lZCB0aGUgcHJldmlvdXMgZmFsbCwgd2hpbGUgZmlzaCB0aGF0IGVtaWdyYXRlIGF0IEFnZS0xIHdvdWxkIGhhdmUgc3BlbnQgYSBmdWxsIHllYXIgaW4gdGhlIHN0cmVhbSAoaS5lLiwgc3Bhd25lZCAyIGZhbGxzIHByZXZpb3VzKSBhbmQgQWdlLTErIGZpc2ggd291bGQgaGF2ZSBzcGF3bmVkIDMgeWVhcnMgcHJldmlvdXMuIFVzaW5nIHRoaXMgaW5mb3JtYXRpb24sIHdlIGNhbiB0aGVuIGNhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIGp1dmVuaWxlcyBwcm9kdWNlZCBieSBlYWNoIHNwYXduaW5nIGV2ZW50IHRvIGNhbGN1bGF0ZSBlZ2ctdG8tZnJ5IHN1cnZpdmFsLg0KDQoNCg0KIyMjIDMuMiBXaGF0IGFib3V0IG1hcmluZSBzdXJ2aXZhbCAoZnJvbSBzbW9sdCB0byBzcGF3bikNCg0KQWRkaXRpb25hbCBhc3N1bXB0aW9ucyBhcmUgcmVxdWlyZWQgdG8gZXN0aW1hdGUgdGhlIG51bWJlciBvZiBqdXZlbmlsZXMgdGhhdCBzdXJ2aXZlIHRvIHJldHVybiBhcyBhZHVsdHM6DQoNCiAgICAtIEFkdWx0cyBzcGVuZCB+MTgtMjAgbW9udGhzIGF0IHNlYSAoMSB3aW50ZXIpLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBsZWF2ZSBTaW1tcyBDcmVlayBhcyBBZ2UtMCBvciBBZ2UtMS4NCiAgICAtIEphY2tzIHJldHVybiB0byBTaW1tcyBDcmVlayBhZnRlciB+Ni04IG1vbnRocyBhdCBzZWEgKDAgd2ludGVycykuIA0KICAgIC0gQWxsIENvaG8gU2FsbW9uIHRoYXQgYXJlIGVudW1lcmF0ZSBhdCB0aGUgZmVuY2Ugb3JpZ2luYXRlZCBmcm9tIFNpbW1zIENyZWVrIChpLmUuLCB0aGVyZSBhcmUgbm8gaGF0Y2hlcnkgZmlzaCBvciBzdHJheXMgZnJvbSBuZWlnaGJvdXJpbmcgc3RyZWFtcykuDQogICAgDQoNCg0KDQojIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmBgYHtyIGV4aXR9DQprbml0cjo6a25pdF9leGl0KCkNCmBgYA0KDQojIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmBgYHtyIENDVCAtIGN1bS5DYXRjaC5wbG90LGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLndpZHRoID0gOSwgZmlnLmhlaWdodCA9IDE1fQ0KDQpsYWJlbHMgPC0gZGF0YS5mcmFtZShZZWFyID0gdW5pcXVlKFNwcmluZy5DYXRjaCRZZWFyKSwgWVlZRUFSID0gdW5pcXVlKFNwcmluZy5DYXRjaCRZZWFyKSkgJT4lDQogICAgICAgICAgIyBkYXRhLmZyYW1lKFllYXIgPSB1bmlxdWUoQ0NUX2NhdGNoJFllYXIpLCBZWVlFQVIgPSB1bmlxdWUoQ0NUX2NhdGNoJFllYXIpKSAlPiUNCiAgICAgICAgICBtdXRhdGUoWVlZRUFSID0gaWZlbHNlKFllYXIgPT0gMjAyMCwgIjIwMjAgLSBDT1ZJRCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoWWVhciA9PSAyMDIxLCIyMDIxIC0gQ09WSUQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShZZWFyID09IDIwMjMsICIyMDIzIC0gU3RyaWtlIixZZWFyKSkpLA0KICAgICAgICAgICAgICAgICBsYWJYID0gYXMuRGF0ZShpZmVsc2UoWWVhciA9PSAyMDIwLCBhcy5EYXRlKCIyMDI0LTA1LTI1IiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoWWVhciA9PSAyMDIxLGFzLkRhdGUoIjIwMjQtMDUtMjUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoWWVhciA9PSAyMDIzLCBhcy5EYXRlKCIyMDI0LTA1LTI1IiksYXMuRGF0ZSgiMjAyNC0wNC0xNiIpKSkpKSkNCmdncGxvdChTcHJpbmcuQ2F0Y2gpICsgDQogICAgICBnZW9tX2NvbChhZXMoeD0gZGF0ZS5zdGQsIHkgPWNhdGNoKSkrDQogICAgICBnZW9tX2xpbmUoYWVzKHg9IGRhdGUuc3RkLCB5ID0gcHJvcC5zY2FsZWQpKSArDQogICAgICBnZW9tX2xhYmVsKGRhdGEgPSBsYWJlbHMsIGFlcyhsYWJlbCA9IFlZWUVBUiksDQogICAgICAgICAgICAgICAgeCA9IGFzLkRhdGUoIjIwMjQtMDQtMTUiKSwgeSA9IDIwNSwNCiAgICAgICAgICAgICAgICBoanVzdCA9ICJsZWZ0Iiwgdmp1c3QgPSAwLA0KICAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UpKw0KICAgICAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjIgd2VlayIsIGRhdGVfbGFiZWxzID0gIiViLSVkIikgKw0KICAgICAgc2NhbGVfeV9jb250aW51b3VzKCJUb3RhbCBDYXB0dXJlcyAoIyBvZiBGaXNoKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgc2VjLmF4aXMgPSBzZWNfYXhpcyh+Li8zMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiUHJvcG9ydGlvbiBvZiBUb3RhbCBDYXRjaCAoJSkiKSkrDQogICAgICBmYWNldF9ncmlkKFllYXJ+U3BlY2llcykgKw0KICAgICAgbGFicyh4PSIiLCB5ID0gIlRvdGFsIENhcHR1cmVzICgjIG9mIEZpc2gpIikgKw0KICAgICAgdGhlbWVfYncoKSArDQogICAgICB0aGVtZShzdHJpcC50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpDQogICAgDQpgYGANCg0KYGBge3IgQ0NUIC0gY3VtLkNhdGNoLnBsb3QyLGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSB9DQogICAgZ2dwbG90KENDVF9jYXRjaCkgKw0KICAgICAgICBnZW9tX2xpbmUoYWVzKHg9IGRhdGUuc3RkLCB5ID0gcHJvcCwgY29sb3IgPSBZZWFyKSkgKw0KICAgICAgICBsYWJzKHggPSAiIiwgeSA9ICJQcm9wb3J0aW9uIG9mIFRvdGFsIENhdGNoICglKSIpICsNCiAgICAgICAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgd2VlayIsIA0KICAgICAgICAgICAgICAgICAgICAgbWlub3JfYnJlYWtzID0gIjEgZGF5IiwNCiAgICAgICAgICAgICAgICAgICAgIGRhdGVfbGFiZWxzID0gJyViLSVkJykrIA0KICAgICAgICBmYWNldF9ncmlkKERlY2FkZX4uKSsNCiAgICAgICAgdGhlbWVfYncoKSArDQogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KDQoNCg0KYGBgDQoNCmBgYHtyIENUIENhdGNoIFN1bW1hcnksIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCiMjIyBQcmVwIERhdGEgLS0tLQ0KQ1RfY2F0Y2ggPC0gY2F0Y2hfc3VtbWFyeSAlPiUNCiAgICAgICAgICAgIHNlbGVjdCgxOjEzKSAlPiUgICMgU2VsZWN0IENUIERhdGENCiAgICAgICAgICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBQZXJpb2QsIHZhbHVlc19mcm9tID0gMzoxMykgJT4lDQogICAgICAgICAgICBzZWxlY3QoMSwgZW5kc193aXRoKCJTcHJpbmciKSwgZW5kc193aXRoKCJGYWxsIikpICU+JQ0KICAgICAgICAgICAgdW5ncm91cCgpICU+JQ0KICAgICAgICAgICAgYWRkX3JvdyhZZWFyID0gYygyMDIwLCAyMDIxLCAyMDIzKSkgJT4lDQogICAgICAgICAgICBhcnJhbmdlKFllYXIpDQoNCg0KIyMgQ1QgS2FibGUgLS0tLQ0Ka2FibGUoQ1RfY2F0Y2gsDQogICAgICAiaHRtbCIsDQogICAgICBib29rdGFicyA9IFQsDQogICAgICBhbGlnbiA9IGMoImMiKSwNCiAgICAgIGNvbC5uYW1lcyA9IGMoIlllYXIiLCJTdGFydCIsICJFbmQiLCAiIyBEYXlzIFNhbXBsZWQiLCAgDQogICAgICAgICAgICAgICAgICAgICJuIiwiTWVkLiIsIk1pbiIsIk1heCIsICJNZWFuIiwgIlNEIiAsIk1pbiIsIk1heCIsDQogICAgICAgICAgICAgICAgICAgICJTdGFydCIsICJFbmQiLCAiIyBEYXlzIFNhbXBsZWQiLCAgDQogICAgICAgICAgICAgICAgICAgICJuIiwiTWVkLiIsIk1pbiIsIk1heCIsICJNZWFuIiwgIlNEIiAsIk1pbiIsIk1heCIpLA0KICAgICAgY2FwdGlvbiA9ICIqKlRhYmxlIDEuIFNwcmluZyBhbmQgRmFsbCBUcmFwcGluZyBvZiBDQ1QuKioiLA0KICAgICAgZGlnaXRzID0gMSkgJT4lDQogICNjb2x1bW5fc3BlYyhjKDEsIDMsMTAsMTcpLCBib2xkID0gVFJVRSkgJT4lDQogIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gIEZBTFNFLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gImNlbnRlciIsIA0KICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSA9IDEyLA0KICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVFJVRSkgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICI9MSwgIlNhbXBsZSBQZXJpb2QiID0gMywgIkNhcHR1cmUgVGltaW5nIiA9IDQsIkZvcmsgTGVuZ3RoIChtbSkiID0gNCwNCiAgICAgICAgICAgICAgICAgICAgICJTYW1wbGUgUGVyaW9kIiA9IDMsICJDYXB0dXJlIFRpbWluZyIgPSA0LCJGb3JrIExlbmd0aCAobW0pIiA9IDQpKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsIlNwcmluZyIgPSAxMSwgIkZhbGwiID0gMTEpKSANCiANCmBgYA0KDQpgYGB7ciBDVCBTaXplIERpc3RyaWJ1dGlvbiwgbGVuZ3RoLWZyZXF1ZW5jeSBhbGwgeWVhcnMsZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KIyMgTGVuZ3RoLUZyZXF1ZW5jeSBQbG90IG9mIGFsbCBDQ1QgY2FwdHVyZWQgdG8gZGF0ZS4NCiAgICAjIyBQcmVwYXJlIERhdGENCiAgICBDVF9kYXQgPC0gZGF0YV9hbGwgJT4lIA0KICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoU3BlY2llcyA9PSAiQ1QiKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgbXV0YXRlKGRhdGUuc3RkID0gIGNhc2Vfd2hlbih5ZWFyKERhdGUpID49IDAgfiAneWVhcjwtJyhEYXRlLCAyMDI0KSkpIA0KICAgICAgICAgICAgICAgICAgICANCg0KICAgICAgIyMgUHJlcGFyZSBQbG90DQogICAgICBhbGxfeWVhcnMucGxvdCA8LSBnZ3Bsb3QoQ1RfZGF0KSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBMZW5ndGgpLCBiaW53aWR0aCA9IDUsIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFicyh4ID0gIkZvcmsgTGVuZ2h0IChtbSkiLCB5ID0gIkZyZXF1ZW5jeSAoIyBGaXNoKSIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDUwLCA0NTAsIGJ5ID0gMjUpKSsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA0NTAsIDUwKSkrDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgdmp1c3QgPSAxLjIsIGhqdXN0ID0gMSkpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZV9idygpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNldF9ncmlkKFllYXJ+LikNCmBgYA0KDQpgYGB7ciBjb21wYXJlIHJlZ2lvbmFsIHRyZW5kcywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KIyMgUHJlcCBSZWdpb25hbCBBYnVuZGFuY2UgRGF0YXNldA0KcmVnLmFidW5kIDwtIHJlZy5kYXQgJT4lIA0KICAgICAgICAgICAgICAgIG11dGF0ZShkYXRhX3NldCA9ICJERk8iKSAlPiUNCiAgICAgICAgICAgICAgICBzZWxlY3QoZGF0YV9zZXQsIHllYXIsIHNwZWNpZXMsIHNwYXduZXJzLCBzbW9vdGhlZFNwYXduZXJzKSAlPiUNCiAgICAgICAgICAgICAgICByZW5hbWUoWWVhciAgICAgPSB5ZWFyLA0KICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWVzICA9IHNwZWNpZXMsDQogICAgICAgICAgICAgICAgICAgICAgIG4gICAgICAgID0gc3Bhd25lcnMsDQogICAgICAgICAgICAgICAgICAgICAgIG5fc21vb3RoID0gc21vb3RoZWRTcGF3bmVycykgJT4lIA0KICAgICAgICAgICAgICAgIG11dGF0ZShTcGVjaWVzID0gcmVjb2RlKGFzLmZhY3RvcihTcGVjaWVzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29obyIgICAgICA9ICJDT19BZHVsdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5vb2siICAgPSAiQ04iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQaW5rIiAgICAgID0gIlBLIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2h1bSIgICAgICA9ICJDTSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvY2tleWUiICAgPSAiU0siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGVlbGhlYWQiID0gIlNUIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZXMgPSBmYWN0b3IoU3BlY2llcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiQ1QiLCJDT19BZHVsdCIsICJDTiIsIkNNIiwiUEsiLCAiU0siLCAiU1QiKSkpDQojIFByZXBhcmUgU2ltbXMgRGF0YSBhbmQgSm9pbiB3aXRoIFJlZ2lvbmFsIERhdGEgICAgICAgICAgICAgICAgDQpjYXRjaF9zcHJpbmcgPC0gZGF0YV9hbGwgJT4lDQogICAgICAgICAgICAgICAgICAgIGZpbHRlcihQZXJpb2QgPT0gIlNwcmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWVzICVpbiUgYygiQ1QiLCAiQ08iKSkgJT4lDQogICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KFllYXIsU3BlY2llcykgJT4lDQogICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYShTcGVjaWVzKSkgJT4lDQogICAgICAgICAgICAgICAgICAgIG11dGF0ZShuX3Ntb290aCA9IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3NldCA9ICJTaW1tcyIpICU+JSANCiAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGUoZGF0YV9zZXQpICU+JQ0KICAgICAgICAgICAgICAgIHJiaW5kKHJlZy5hYnVuZCkNCg0KY2F0Y2hfc3ByaW5nX0NPIDwtIGNhdGNoX3NwcmluZyAlPiUNCiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoWWVhciA+PSAyMDA4KSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QoIW5fc21vb3RoKQ0KDQpnZ3Bsb3QoY2F0Y2hfc3ByaW5nX0NPLCANCiAgICAgICBhZXMoeCA9IFllYXIsIHkgPSBuKSkgKw0KICBnZW9tX3BvaW50KCkgKyANCiAgZ2VvbV9saW5lKCkgKyANCiAgZmFjZXRfZ3JpZChTcGVjaWVzIH4uLCBzY2FsZXMgPSAiZnJlZSIpDQoNCmNhdGNoX3NwcmluZ19sb25nIDwtIGNhdGNoX3NwcmluZ19DTyAlPiUNCiAgICAgIHNlbGVjdCghZGF0YV9zZXQpICU+JQ0KICAgICAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IFNwZWNpZXMsIHZhbHVlc19mcm9tID0gbikgJT4lDQogICAgICBkcm9wX25hKCkNCg0KY29yKGNhdGNoX3NwcmluZ19sb25nKQ0KYGBgDQoNCiMgMy4gRmFsbCBGZW5jZSBPcGVyYXRpb24NCiMjIyAzLjEuIE1vbml0b3JpbmcgRWZmb3J0DQoNCg0KDQo=